控制器范围对象更改未反映在指令$ watch回调中

时间:2013-12-11 13:36:43

标签: angularjs angular-ui-router

我有一个控制器,其范围有一个对象:$scope.objToTrack。 我有一个嵌套视图中的指令,$ watch监视该对象的更改 它具有隔离范围,但objToTrack设置为=,以便可以观看。

当我单击该指令时,它会调用一个表达式,该表达式是控制器上更改objToTrack的方法。

这是一个plunker来说明我的设置。

问题是虽然对象已更改,但objToTrack $ watch回调未被触发 如果在Test1和Test2状态之间切换,则对objToTrack所做的更改是可见的。只是我不明白为什么它不能立即点击。

感谢。

3 个答案:

答案 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”会显示。