我在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);
});
答案 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() {...});
和观察者通常在初始化时调用一次。谢谢大家的帮助。