After a project with Web Components, i'm going back to AngularJS. I'm frustrated by the fact I can't find a proper way for a directive to keep its CSS internal (or encapsulated).
With web component I hadn't this problem since there is already a style tag that can be embedded in the template.
That's not the case with AngularJS directives.
Until here what I saw is :
1) define an CSS rule in an external file : my-directive {color:red;}, but this is not encapsulation.
2) define an internal rule with element.css({}); inside link function, but in this case the style is applied inline and thus is too heavy and cannot be easily override by external css.
Are there other ways ?
Thanks
There is a one angular service already created on GitHub, you can load your css files dinamically, maybe it can be helpful
https://github.com/Yappli/angular-css-injector
Or you can give a chance to GruntJS and you can have a very nice project structure, every module/folder can have own css file, and Grunt will bundle all that files into one (or many, it depends how you configure). It's easy to manage and change, but also you have only one file loaded on your page. Maybe these links can be helpful to find Grunt module that can help you.
https://www.npmjs.org/package/grunt-contrib-cssmin
One Method you can try is declaring and assigning the styles in JavaScript.
Declare a Style object.
styles = {
background: 'green',
color: 'black'
};
Assign the object to a template using ng-style
<div ng-style="$ctrl.styles">
My Component with local CSS
</div>
Here are some the following advantages using this method
Full Example
//Component
class myComponent {
constructor( myCSSService ) {
this.styles = {
background: 'black',
color: 'white'
};
this.myCSSService = myCSSService;
}
}
myComponent.$inject = [ 'myCSSService' ];
angular.module( 'myModule', [] )
.component( 'myComponent', {
controller: myComponent,
bindings: {},
template: `
<div ng-style="$ctrl.styles">
My Component with local CSS
</div>
<div ng-style="$ctrl.myCSSService.styles">
My Component with Injected CSS
</div>
`,
} );
//Style Service
class myCSSService{
constructor( ) {
this.styles = {
background: 'green',
color: 'black'
};
}
}
angular.module( 'myCSSModule', [] )
.service( 'myCSSService', myCSSService );
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With