我遇到了angularjs的奇怪情况。我有一个绑定到指令的值,我需要能够从控制器和指令中检查和操作该值。我还有一个方法作为绑定到我需要从控制器调用的指令的对象的属性。期望该方法相应地对结合值作出反应。
这是一些伪代码来说明它:
.controller('ctrl', function(){
$scope.someAction = function(){
$scope.myValue = undefined;
$scope.someObject.myMethod();
};
});
.directive('myDirective', ...){
return {
...
scope: { myValue: '=', someObject: '=' },
link: function (scope) {
scope.someObject = {
myMethod: function(){
if (angular.isDefined(scope.myValue)){
// do something
}
else {
// do something else
}
}
};
}
}
}
并在控制器模板中:
<my-directive my-value="myValue" some-object="someObject"></my-directive>
我希望当&#34; someAction&#34;被触发,&#34; myValue&#34;设置为undefined和方法&#34; someObject.myMethod&#34;从控制器调用,&#34; myValue&#34;在指令中是未定义的,但它不是这样的。但是,如果我将方法调用包装在等待仅1毫秒的$ timeout中,我会得到预期的行为:
.controller('ctrl', function($timeout){
$scope.someAction = function(){
$scope.myValue = undefined;
$timeout(function() {
$scope.someObject.myMethod();
}, 1);
};
});
这个黑客已经解决了我的问题,但我更愿意理解发生了什么,并且可能更优雅地解决它(或者避免它)......
答案 0 :(得分:0)
您的控制器函数$ scope.someAction由angular包装到$ apply调用中。所以,可能在你调用$ scope.someObject.myMethod()时,指令的隔离范围没有更新,因为$ apply没有结束。解决方案是做一些你建议的事情:
$timeout(function() {
$scope.someObject.myMethod();
}, 0);
超时将延迟执行到下一个$ apply调用的函数,因此您的指令将看到更新的值。