Che*_*niv 29 javascript onload angularjs angularjs-directive jqlite
我一直在寻找一个简单但不是微不足道的问题的答案:onload
用jqLite在Angular中捕获图像' 事件的正确方法是什么?我发现了这个问题,但我想要一些指令解决方案.
正如我所说,我不接受这个:
.controller("MyCtrl", function($scope){
// ...
img.onload = function () {
// ...
}
Run Code Online (Sandbox Code Playgroud)
因为它在控制器中,而不是在指令中.
Sam*_*nes 33
这是一个可重复使用的指令,采用angular内置事件处理指令的风格:
angular.module('sbLoad', [])
.directive('sbLoad', ['$parse', function ($parse) {
return {
restrict: 'A',
link: function (scope, elem, attrs) {
var fn = $parse(attrs.sbLoad);
elem.on('load', function (event) {
scope.$apply(function() {
fn(scope, { $event: event });
});
});
}
};
}]);
Run Code Online (Sandbox Code Playgroud)
当触发img load事件时,sb-load属性中的表达式将在当前作用域中与load事件一起计算,并作为$ event传入.以下是如何使用它:
HTML
<div ng-controller="MyCtrl">
<img sb-load="onImgLoad($event)">
</div>
Run Code Online (Sandbox Code Playgroud)
JS
.controller("MyCtrl", function($scope){
// ...
$scope.onImgLoad = function (event) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
注意:"sb"只是我用于自定义指令的前缀.
Che*_*niv 31
好的,jqLite的bind
方法做得很好.它是这样的:
我们在img
标签中添加了指令'name as attribute .在我的情况下,加载后,根据其尺寸,图像必须将其类名从"水平"更改为"垂直",因此指令的名称将是"可定向的":
<img ng-src="image_path.jpg" class="horizontal" orientable />
Run Code Online (Sandbox Code Playgroud)
然后我们创建这样的简单指令:
var app = angular.module('myApp',[]);
app.directive('orientable', function () {
return {
link: function(scope, element, attrs) {
element.bind("load" , function(e){
// success, "onload" catched
// now we can do specific stuff:
if(this.naturalHeight > this.naturalWidth){
this.className = "vertical";
}
});
}
}
});
Run Code Online (Sandbox Code Playgroud)
示例(显式图形!):http://jsfiddle.net/5nZYZ/63/
AngularJS V1.7.3添加了ng-on-xxx
指令:
<div ng-controller="MyCtrl">
<img ng-on-load="onImgLoad($event)">
</div>
Run Code Online (Sandbox Code Playgroud)
AngularJS 为许多事件提供了特定的指令,例如ngClick
,因此在大多数情况下没有必要使用ngOn
。然而,AngularJS 并不支持所有事件,并且在以后的 DOM 标准中可能会引入新事件。
有关更多信息,请参阅AngularJS ng-on 指令 API 参考。
归档时间: |
|
查看次数: |
55815 次 |
最近记录: |