如何观看 img 元素的 ngSrc 并在自定义指令中获取新的宽度和高度
How can I watch ngSrc of an img element and get the new width and height inside of my custom directive?
index.html 片段:
<img ng-src="{{ImageURL}}" my-image/>
应用.js:
var app = angular.module('plunker', []);
app.controller('MyCtl', function($scope) {
$scope.ImageURL = "";
$scope.ImgWidth = 0;
$scope.setImgSrc = function(imgURL) {
$scope.ImageURL = imgURL;
};
$scope.setImgSrc('http://angularjs.org/img/AngularJS-large.png');
});
app.directive('myImage', [function() {
return function(scope, elm, attrs) {
scope.$watch(elm.width(), function(newValue, oldValue) {
scope.ImgWidth = newValue; // always returns 0!
});
};
}]);
这是扑通。 当ngSrc
更改时,如何在自定义指令中获取 img
元素的新维度? 我有一种感觉,我没有正确调用scope.$watch
.
你 plunk 中的手表是正确的,尽管 SO 上的例子不是,而且两者都不能做到你的期望。
监视表达式应为字符串表达式或函数。在您的示例中,您正在尝试观察elm.width()
的结果...最有可能是 0。这实质上等同于说scope.$watch(0, function() {...})
。如果你想观察宽度,你需要做scope.$watch(function() { return elm.width(); }, function() {...})
尽管经常点击 DOM 是一个坏主意,尤其是从手表表达式中。
更好的方法是等到加载图像(使用 load
事件)并在此时更新测量值。DOM 只会在更新图像时命中。我已经在这里更新了 plunk。
它可能不值得注意,因为图像太小了,但是您在加载图像之前就获得了宽度。要解决此问题,请向元素添加加载时
app.directive('myImage', [function() {
return function(scope, elm, attrs) {
elm.on('load', function()
{
scope.ImgWidth = $(this).width();
scope.$apply();
});
};
}]);
问题出在你对$watch的调用中。 $watch期望第一个参数是要评估的字符串或它可以调用然后检查其值的函数。你传递的是一个整数。试试这个:
scope.$watch(function() { return elm.width(); }, function(newValue, oldValue) {
scope.ImgWidth = newValue;
});
在这里扑克:http://plnkr.co/edit/93SvAosQWkQzRq0DFXaK?p=preview
请注意,要获得 width() 函数,您还需要包含完整的 jQuery,我已经在我的 plunk 中完成了此操作。
更新 - plunk 更新以遵循@Andyrooger关于处理加载事件的建议。更好的办法是获取加载事件处理程序中的宽度,但我保持原样,以保持有关$watch问题的精神。
- 如何在自定义指令中获取计算的属性
- 如何在给定的angular应用程序中获取所有指令名称
- 如何在另一个组件中获取指令/组件实例
- 内容安全策略指令:;脚本src'self'blob:文件系统:chrome扩展资源:“;获取是否时
- AngularJS:在指令中获取KeyValuePairs
- 如何使用angular指令从html中获取数组
- 获取 Angular UI-Calendar 上的所有事件(Arshaw 完整日历的指令)
- angularJS获取指令的内部元素
- 剑道网格:在Angular指令中获取一个实例
- 无作用域指令-如何获取数据
- Angular中的指令未获取数据
- 在 Angular 指令中获取原始包含的内容
- Angularjs获取指令中的数据
- 获取指令的子元素的值
- Angularjs:获取指令中另一个控制器内定义的控制器中作用域变量的值
- 无法获取指令模板中ng模型中的变量
- Angular - ui-router - directive -获取指令的偏移量/位置
- Angular JS-在视图渲染之前获取指令中的元素高度
- AngularJS:编译前获取指令内容
- AngularJS:在编译前获取指令的html内容