Gunter 的回答激发了我对这一点的更多测试。下面是一些如何将class 或style 与NgDirective 和NgComponent 一起使用的示例。
如果您将applyAuthorStyles: true 与组件一起使用,那么放置指令相关类的最佳位置是顶级css 文件(如我的示例中所示)。这样,只有一个地方可以放置与指令相关的 css 定义。如果你不使用applyAuthorStyles,那么你必须把css-code放到每个组件的css-file中。
element.style.border = "2px solid yellow"; 的使用也很好,即。当您通过设置element.style.border = ""; 删除样式时,会自动再次应用之前定义的样式。
我找不到将ng-class(或任何其他 ng-something)与指令一起使用的简单方法。 MyComp2 使用 ng-class 和 my-directive3,但感觉有点 hacky。也许使用 Scope 可以更好地从指令中为 ng-class 赋值。
编辑:Gunter 指出 applyAuthorStyles 已被或将被弃用。
my_comp.css:
div {
background-color: lightgray;
}
ok_dir_css.css:
div {
border: 2px solid black;
margin: 5px;
}
.test {
border: 2px solid red;
}
ok_dir_css.html:
<!DOCTYPE html>
<html ng-app>
<head>
<meta charset="utf-8">
<title>OK dir css</title>
<link rel="stylesheet" href="ok_dir_css.css">
</head>
<body>
<div my-directive1><p>Directive1 with css class</p></div>
<div my-directive2><p>Directive2 with inline style</p></div>
<my-comp1></my-comp1>
<my-comp2></my-comp2>
<script type="application/dart" src="ok_dir_css.dart"></script>
<script src="packages/browser/dart.js"></script>
</body>
</html>
ok_dir_css.dart:
import 'dart:html';
import 'package:angular/angular.dart';
@NgDirective(
selector: '[my-directive1]'
)
class MyDirective1 {
Element element;
MyDirective1(this.element) {
element
..onMouseOver.listen(mouseOver)
..onMouseLeave.listen(mouseLeave);
}
void mouseOver(MouseEvent event){
element.classes.add("test");
}
void mouseLeave(MouseEvent event){
element.classes.remove("test");
}
}
@NgDirective(
selector: '[my-directive2]'
)
class MyDirective2 {
Element element;
MyDirective2(this.element) {
element
..onMouseOver.listen(mouseOver)
..onMouseLeave.listen(mouseLeave);
}
void mouseOver(MouseEvent event){
element.style.border = "2px solid yellow";
}
void mouseLeave(MouseEvent event){
element.style.border = "";
}
}
@NgDirective(
selector: '[my-directive3]'
)
class MyDirective3 {
@NgTwoWay('my-directive3')
String strClass;
Element element;
MyDirective3(this.element, Scope scope) {
element
..onMouseOver.listen(mouseOver)
..onMouseLeave.listen(mouseLeave);
}
void mouseOver(MouseEvent event){
strClass = "test";
}
void mouseLeave(MouseEvent event){
strClass = null;
}
}
@NgComponent(
selector: 'my-comp1',
template: r'<div my-directive1><p>my-comp1 with Directive1</p></div><div my-directive2><p>my-comp1 with Directive2</p></div>',
cssUrl: 'my_comp.css',
applyAuthorStyles: true,
publishAs: 'cmp'
)
class MyComp1 {
}
@NgComponent(
selector: 'my-comp2',
template: r'<div my-directive3="cmp.classStr" ng-class="cmp.classStr" ng-mouseover="cmp.over()"><p>my-comp2 with ng-class and Directive3</p></div>',
cssUrl: 'my_comp.css',
applyAuthorStyles: true,
publishAs: 'cmp'
)
class MyComp2 {
String classStr;
void over(){
print("over");
}
}
class MyAppModule extends Module {
MyAppModule() {
type(MyDirective1);
type(MyDirective2);
type(MyDirective3);
type(MyComp1);
type(MyComp2);
}
}
void main() {
ngBootstrap(module: new MyAppModule());
}