我正在尝试从主控制器更改指令。
这是指令代码
# directive.coffee
application.directive 'btnState', ->
{
restrict: 'A'
link: (scope, el, attrs) ->
attrs.$observe 'ngModel', (newVal) ->
switch newVal
when 'loading'
# do something
when 'reset'
# do other thing
el.click (event) ->
attrs.$set 'ngModel', 'loading'
return
}
现在在我的模板中
<button id="#do-btn" ng-click="doSometing()" ng-model="ns.btn_state" btn-state>Do it</button>
<button id="#cancel-btn" ng-click="ns.btn_state = 'reset'">Cancel</button>
当我点击#do-btn
按钮时工作正常$observe
捕获更改,但当我尝试从外部更改ns.btn_state
时,从未捕获
我如何解决这个问题?
我正在使用角度1.0.7
答案 0 :(得分:0)
请注意,attrs.$observe
和attrs.$set
用于操纵给定属性的值,而不是内容。
如果您关心内容,则应使用$watch
和$parse
覆盖属性的值。
例如在
中<input ng-model="foo" />
与
$scope.foo = "bar";
属性'ngModel'
的值为"foo"
,其内容为"bar"
。
如果您不希望属性的值发生更改,即未插入,则为了读取/写入模型的内容它代表你可以做到
var model = $parse(attrs.foo);
var content = model(scope); // read
scope.$apply(function () {
model.assign(scope, 'new content'); // write
});
对做出反应
scope.$watch(attrs.foo, function (new, old) { ... });
如果您的属性是插值的,那么在观看和解析之前你应该$observe
,但似乎是一个非常复杂的用例。