我有一個示例指令,監視元素中的更改,如offsetWidth。爲什麼ng-src在AngularJS中不觸發某些屬性更改?
如果我申請指令到通過src屬性加載的URL的img元素,一切工作正常。
如果我申請的指令來加載通過NG-src屬性的URL的img元素,offsetWidth沒有更新。
HTML:
<!DOCTYPE html>
<html ng-app="test">
<head>
<script data-require="[email protected]" data-semver="1.2.0-rc2" src="http://code.angularjs.org/1.2.0-rc.2/angular.js"></script>
<script src="script.js"></script>
</head>
<body>
<h1>OffsetWidth: {{offsetwidth}} OffsetLeft: {{offsetleft}}</h1>
<img testing ng-src="{{'http://scienceblogs.com/scientificactivist/wp-content/blogs.dir/392/files/2012/04/i-dcb85296b3695e8ce6d1ae4d660cea30-Smiley-face.gif'}}"></img>
</body>
</html>
的Javascript:
angular.module('test', []).
directive('testing', function() {
return function(scope, element, attr) {
scope.$watch(
'element.offsetWidth',
function(newVal, oldVal) {
scope.offsetwidth = element[0].offsetWidth
}
)
scope.$watch(
'element.offsetLeft',
function(newVal, oldVal) {
scope.offsetleft = element[0].offsetLeft
}
)
}
});
UPDATE:
我申請以下布歐Nguyen的解決方案,以確保正確的變化是w ^但是,似乎存在時間問題。當多次重新加載頁面時,我注意到有時值會正確更新,有時不會。
更新的javascript:
angular.module('test', []).
directive('testing', function() {
return function(scope, element, attr) {
scope.$watch(
function() {
return element[0].offsetWidth
},
function(newVal, oldVal) {
scope.offsetwidth = element[0].offsetWidth
}
)
scope.$watch(
function() {
return element[0].offsetLeft
},
function(newVal, oldVal) {
scope.offsetleft = element[0].offsetLeft
}
)
}
});
有趣的優先級更高。那之前它是如何工作的?調用'element.offsetLeft'來觀察是返回正確的值,所以它似乎正在評估正確的範圍。 –
如果不在範圍內,範圍無法通過字符串表達式進行觀察。然而,監聽器總是初始化一次初始值(如果你想知道爲什麼,請閱讀文檔或代碼),所以一些幸運的時機可能會讓你的原始代碼在特定的時間點對某些屬性起作用,但是這並不「這意味着它是正確的代碼。 –
很容易驗證,而不是在偵聽器內使用'element [0] .offsetLeft',而是使用'newVal'。我相信它會是'undefined'。 –