2013-07-09 11 views
27

Ich habe nach einer Antwort auf einfache, aber nicht triviale Frage gesucht: Was ist ein richtiger Weg, um Bild 'onload Ereignis in Angular nur mit jqLite zu fangen? Ich habe this question gefunden, aber ich möchte eine Lösung mit Direktiven.
Also wie gesagt, das ist nicht für mich akzeptiert:AngularJS - Bild "onload" -Ereignis

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

, weil es in der Steuerung ist, nicht in der Richtlinie.

Antwort

28

Hier ist eine wiederverwendbare Richtlinie im Stil der Winkel des eingebauten Event-Handling-Richtlinien:

Wenn das Ereignis img load ausgelöst wird, wird der Ausdruck im Attribut sb-load im aktuellen Bereich zusammen mit dem load -Ereignis ausgewertet, das als $ event übergeben wird. Hier ist, wie es zu benutzen:

HTML

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

JS

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

Hinweis: "sb" ist nur das Präfix ich für meine benutzerdefinierten Richtlinien verwenden.

+6

Dank Sam, das funktioniert wie ein Charme, ich denke, ich werde das SB-Präfix verlassen, um Ihnen Kredit zu geben. – Michiel

+0

Daumen hoch für eine skalierbare Lösung, die ohne jqLite funktioniert (die aus Angular 2 entfernt wurde) –

31

Ok, jqLite 'bind Methode, die ihren Job gut macht. Es geht so:

Wir fügen den Namen der Direktive als Attribut in unserem img Tag hinzu. In meinem Fall, nach dem Laden und abhängig von seinen Abmessungen, muß Bild seine Klassennamen ändern von „horizontal“ auf „vertikal“, so Name der Richtlinie wird „orient“:

<img ng-src="image_path.jpg" class="horizontal" orientable /> 

Und dann schaffen wir einfach Richtlinie wie folgt aus:

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

Beispiel (explizite Grafik!): http://jsfiddle.net/5nZYZ/63/

Verwandte Themen