且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

AngularJS - 图像“加载"事件

更新时间:2023-11-10 12:35:58

这里有一个可重用的指令,与 angular 的内置事件处理指令的风格相同:

angular.module('sbLoad', []).directive('sbLoad', ['$parse', function ($parse) {返回 {限制:'A',链接:函数(范围,元素,属性){var fn = $parse(attrs.sbLoad);elem.on('load', 函数(事件){范围.$应用(函数(){fn(scope, { $event: event });});});}};}]);

当 img 加载事件被触发时,sb-load 属性中的表达式与加载事件一起在当前范围内计算,作为 $event 传入.使用方法如下:

HTML

<img sb-load="onImgLoad($event)">

JS

 .controller("MyCtrl", function($scope){//...$scope.onImgLoad = 函数(事件){//...}

注意:sb"只是我用于自定义指令的前缀.

I've been searching for an answer to simple but not trivial question: What is a right way to catch image' onload event in Angular only with jqLite? I found this question , but I want some solution with directives.
So as I said, this is not accepted for me:

.controller("MyCtrl", function($scope){
    // ...
    img.onload = function () {
        // ...
    }

because it is in controller, not in directive.

Here's a re-usable directive in the style of angular's inbuilt event handling directives:

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 });
          });
        });
      }
    };
  }]);

When the img load event is fired the expression in the sb-load attribute is evaluated in the current scope along with the load event, passed in as $event. Here's how to use it:

HTML

<div ng-controller="MyCtrl">
  <img sb-load="onImgLoad($event)">
</div>

JS

  .controller("MyCtrl", function($scope){
    // ...
    $scope.onImgLoad = function (event) {
        // ...
    }

Note: "sb" is just the prefix I use for my custom directives.