我正在尝试创建一个像这样使用的指令:
<amount value="myValue" neg-class="negative" />
myValue
是范围值(应该是数字)
negative
只是css类的名称。
该指令背后的想法是,我不想向用户显示货币,当绑定的数量为负数时,negClass get应用于呈现的元素。
我遇到的问题是当更改negClass时,更新不会生效。但我确实看到了DOM中的变化。
这是我的指令定义:
myModule.directive('amount', function () {
return {
restrict: 'E',
replace: true,
template: '<span ng-class="{ {{negClass}}: value < 0 }">{{value | currency}}</span>',
scope: {
value: "=",
negClass: "@",
}
};
});
这是一个演示问题的测试工具:https://dl.dropboxusercontent.com/u/1563210/amtdirtest.html
答案 0 :(得分:10)
大多数角度指令倾向于以这种方式工作。除非文档明确提到支持输入的插值({{...}}
),否则不依赖它更安全,特别是在输入为 = 而不是 @ 的情况下结合。
在ngClass
的情况下,该属性的作用类似于 = 绑定,并且没有提及插值。
指令实际发生的是属性为only observed in the linking phase,并且永远不会再查看属性中的实际文本。因此,当属性继续变化时,从未见过变化。
当ngClass
看到该属性时,它看起来像
{ n: value < 0 }
仍然根据当前value
的范围进行评估,但表达式本身永远不会再次更改。
你正在尝试做的事情的安全方法是创建一个不使用插值的对象,或者只是让一个函数返回哪个类是活动的......以下内容应该有效:
myModule.directive('amount', function () {
return {
restrict: 'E',
replace: true,
template: '<span ng-class="getActiveClass()">{{value | currency}}</span>',
scope: {
value: "=",
negClass: "@",
},
link: function(scope, element, attrs) {
scope.getActiveClass = function() {
if(scope.value < 0)
return scope.negClass;
}
}
};
});
答案 1 :(得分:0)
最初没有注意到css已经在范围内了。
这是一种使用$compile
和$watch
动态编译元素以监听negClass
.directive('amount', function($compile) {
var template='<span ng-class="{ {{negClass}}: value < 0 }">{{value | currency}}</span>'
return {
restrict: 'E',
replace: true,
scope: {
value: "=",
negClass: "@",
},
link:function(scope,elem,attrs){
scope.$watch('negClass',function(){
elem.html('').append($compile(template)(scope) )
})
}
};
});
的 DEMO 强>