$ watch vs花括号 - $ watch不会捕捉范围变量的变化

时间:2016-07-07 19:33:22

标签: javascript angularjs

我在AngularJS中遇到了问题。我会尝试简化一些事情来解释我遇到的问题。

我已经创建了一个应该处理图像上传的指令。流程是这样的。

如果图像存在,服务器将返回静态服务图像的URL。 url和指令是从服务器异步加载的,因此无法确定哪个将首先加载。我传递一个我得到的变量作为属性

<my-directive vc-current-url="vm.data.profileURL"> </my-directive>

指令范围

scope : { "currentURL" : '=vcCurrentUrl' }

因此,在我的模板中,我能够{{scope.currentURL}},当它被加载时 - 它会显示出来。但是当加载该URL时我必须做更多的事情 - 将它传递给另一个函数(原因)。很好我只会添加一个观察者并等待它加载?但不是。

scope.$watch(scope.currentURL, function (newValue, oldValue) {
    console.log(' changed to ' + newValue + ' from ' + oldValue);
}, true);

console.log被调用一次并打印

changed to undefined from undefined

我错过了什么?

哦,我正在使用Angular 1.5。

EDIT 几个答案是我没有看到正确的变量。下面的代码不起作用,它会抛出

Error: currentURL is not defined

代码:

scope.$watch('currentURL', function (newValue, oldValue) {
    console.log(' changed to ' + newValue + ' from ' + oldValue);
});

3 个答案:

答案 0 :(得分:1)

首先,这是你观察价值的方式

scope.$watch('currentURL'

其次,这就是你的范围def看起来像

的方式
scope : { "currentURL" : '=vcCurrentUrl' }

所以你对视图的指令应该是

<my-directive data-vc-current-url="vm.data.profileURL"> </my-directive>

答案 1 :(得分:1)

请改为尝试:

scope.$watch('currentURL', function (newValue, oldValue) {
    console.log(' changed to ' + newValue + ' from ' + oldValue);
});

您没有正确引用范围变量。

答案 2 :(得分:1)

所以我错了。

Austn和Alon是对的,但我没注意到他们在变量名称周围有撇号,我没有。

在谈话之后,我试图将我的观察者功能置于$ timeout。变量在下一个循环中加载,我得到了一些奇怪的解析消息(url.com/variable.jpg不是有效的var名称)。

所以在那一点上我意识到,如果你不将var名称放在撇号中,它将使用var值(或未定义)。

那么为什么我会得到控制台日志,而我所做的实际上是

$watch(undefined, function() {...}); 

和观察者通常在初始化时调用一次。谢谢大家的帮助。