我有一个控制器,其范围有一个对象:$scope.objToTrack
。
我有一个嵌套视图中的指令,$ watch监视该对象的更改
它具有隔离范围,但objToTrack
设置为=
,以便可以观看。
当我单击该指令时,它会调用一个表达式,该表达式是控制器上更改objToTrack
的方法。
这是一个plunker来说明我的设置。
问题是虽然对象已更改,但objToTrack
$ watch回调未被触发
如果在Test1和Test2状态之间切换,则对objToTrack
所做的更改是可见的。只是我不明白为什么它不能立即点击。
感谢。
答案 0 :(得分:3)
要回答问题...如果您将自己的事件处理程序绑定到元素,并在该事件处理程序中更改角度范围,则需要调用$apply
,以便让角度知道更改并运行摘要
示例您有:
element.on('click',function(){
scope.onClick({number:RNG.int(200,300)});
});
需要更改为:
element.on('click',function(){
scope.$apply(function(){
scope.onClick({number:RNG.int(200,300)});
});
});
如果使用angular已经提供的事件指令,则会简单得多。在这种情况下,您使用ng-click
编写了大量额外代码。当你尽可能保持角度时,它也会使测试变得更容易
答案 1 :(得分:1)
另外,如果要将对象传递给指令,则不应使用花括号。
在html中,使用obj-to-track="objToTrack"
,而不是obj-to-track="{{objToTrack}}"
。
像这样:
<div simple-directive obj-to-track="objToTrack" class="directive"></div>
在directive.js中:使用'='进行objToTrack的双向绑定。 像这样:
scope:{
objToTrack:'='
}
答案 2 :(得分:0)
在“test * .html”文件中,将“点按”替换为“ng-click”。
“点击”不会查看当前的控制器,“ng-click”会显示。