Używam teraz modułów css z komponentami AngularJS 1.5. Stos to webpack
+ css-loader?modules=true
+ angular 1.5 components
+ pug
.Lepszy sposób zastosowania modułów css do AngularJS
Obecnie muszę wykonać następujące kroki, aby użyć modułów css w moim szablonie mops.
// my-component.js
import template from 'my-component.pug';
import styles from 'my-component.css';
class MyComponent {
constructor($element) {
$element.addClass('myComponent'); // ------ (1)
this.styles = styles; // ------ (2)
}
}
angular.module(name, deps)
.component('my-component', {
controller: MyComponent,
template: template,
});
// my-component.pug
div(class={{ ::$ctrl.styles.fooBar }}) FooBar // ----- (3)
// my-component.css
.myComponent { background: green; }
.fooBar { color: red; }
Istnieją dwa problemy:
Każdy element musi wstrzykiwać
$element
i ustawić jego nazwę klasy ręcznie. Powodem jest to, że znacznik komponentu AngularJS sam istnieje w wynikowym kodzie HTML bez żadnych klas, co utrudnia CSS. Na przykład, jeśli mogę użyćMyComponent
powyżej tak:<div> <my-component></my-component> </div>
wygeneruje następujący kod HTML:
<div> <my-component> <div class="my-component__fooBar__3B2xz">FooBar</div> </my-component> </div>
porównaniu do ReactJS,
<my-component>
w powyższy wynik HTML jest dodatkowy, czasami to sprawia, CSS trudne pisać. Więc moim rozwiązaniem jest (1), aby dodać do niego klasę.Klasa w szablonie jest za długa (3). Wiem, że to jest poprawny sposób na odniesienie
$ctrl.styles.fooBar
, ale to jest o wiele za długo.
Moja Idealnym rozwiązaniem byłoby tak:
// my-component.js
angular.module(name, deps)
.component('my-component', {
controller: MyComponent,
template: template,
styles: styles,
});
// my-component.css
div(css-class="fooBar") FooBar
Chodzi o to, aby:
- zrobić
angular.module().component
wsparcie dodatkowystyles
atrybut, który będzie automatycznie (2)this.styles = styles;
w kontroler i zastosuj (1)$element.addClass()
również. - dyrektywa
css-class
do zastosowania$ctrl.styles
do elementu.
Moje pytanie brzmi, nie mam pojęcia, jak zrealizować pomysł 1 powyżej (2 jest łatwe). Doceniam, czy ktokolwiek mógłby się o tym przekonać.