AngularJS - 图像"onload"事件

Che*_*niv 29 javascript onload angularjs angularjs-directive jqlite

我一直在寻找一个简单但不是微不足道的问题的答案:onload用jqLit​​e在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"只是我用于自定义指令的前缀.

  • 谢谢山姆,这就像一个魅力,我想我会留下sb前缀给你信用. (6认同)

Che*_*niv 31

好的,jqLit​​e的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/


geo*_*awg 7

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 参考