ng-repeat
我有一个数组或图像 URL,我使用as<img>
元素插入到页面中:
<ul>
<li ng-repeat="image in images">
<img src="{{image.src}}"/>
</li>
</ul>
在将这些图像插入 DOM 后,我想从我的控制器中获取这些图像的尺寸(宽度和高度)。有没有办法遍历我的$scope.images
数组并获取对表示其元素的 DOM 节点的引用?如果不是,那么最好的方法是什么?
ng-repeat
我有一个数组或图像 URL,我使用as<img>
元素插入到页面中:
<ul>
<li ng-repeat="image in images">
<img src="{{image.src}}"/>
</li>
</ul>
在将这些图像插入 DOM 后,我想从我的控制器中获取这些图像的尺寸(宽度和高度)。有没有办法遍历我的$scope.images
数组并获取对表示其元素的 DOM 节点的引用?如果不是,那么最好的方法是什么?
您可以获取特定对象并直接在指令中更改它,因此如果您使用: ng-repeat="img in imgs"
,您将scope.img
在指令中拥有:
.directive('loadable', function () {
return {
link: function(scope, element, attrs) {
element.bind("load" , function(e){
// this is it:
scope.img.dimensions = {
height: element[0].naturalHeight,
width: element[0].naturalWidth
}
console.log(scope.img) // now the original object (in scope)
// has dimensions property!
});
}
}
});
示例:http: //jsfiddle.net/XqeCr/1/
更新建议将对象的操作包装在范围的$aplly
方法调用中:
scope.$apply( function(){
scope.img.dimensions = {
height: element[0].naturalHeight,
width: element[0].naturalWidth
}
});
更新示例:http: //jsfiddle.net/XqeCr/4/
您不应该从控制器访问 DOM - 例如,您将无法测试您的控制器。而是编写一个指令,将 onload 处理程序放在这些图像上,一旦它被调用 - 它会将宽度和高度放入范围
function(scope, el){
el.find('img').on('load', function(){
scope.img.width = this.width;
scope.img.height = this.width;
})
}
并在您的控制器 $watch 中查看此更改,并在填充数据后执行 smth。请注意如何将数据从指令设置到范围内 - 您应该在表达式中添加点以免数据锁定在子范围内 - 请参阅本文:http: //jimhoskins.com/2012/12/14/nested-scopes-in- angularjs.html