2013-07-26 6 views
97

में ng-src के लिए छवि लोड की गई घटना में मेरे पास <img ng-src="dynamically inserted url"/> जैसी छवियां हैं। जब एक छवि लोड हो जाती है, तो मुझे छवि स्क्रॉल करने योग्य बनाने के लिए iScroll रीफ्रेश() विधि लागू करने की आवश्यकता होती है।AngularJS

कुछ कॉलबैक चलाने के लिए कोई छवि पूरी तरह से लोड होने पर जानने का सबसे अच्छा तरीका क्या है?

+1

[$ HTTP प्रतिसाद Interceptors] पर एक नजर डालें (http://docs.angularjs.org/api/ng.$http)। जब आप वादा विफलता –

उत्तर

178

यहाँ एक उदाहरण है कि कैसे छवि ऑनलोड कॉल करने के लिए http://jsfiddle.net/2CsfZ/2/

मूल विचार एक निर्देश बनाएं और टैग img लिए विशेषता के रूप में जोड़ना है।

जे एस:

app.directive('imageonload', function() { 
    return { 
     restrict: 'A', 
     link: function(scope, element, attrs) { 
      element.bind('load', function() { 
       alert('image is loaded'); 
      }); 
      element.bind('error', function(){ 
       alert('image could not be loaded'); 
      }); 
     } 
    }; 
}); 

HTML:

<img ng-src="{{src}}" imageonload /> 
+1

विफलता कॉलबैक के बारे में क्या हल करते हैं तो आप कॉलबैक पंजीकृत करने के लिए इसका उपयोग कर सकते हैं? –

+7

आपका मतलब element.bind ('त्रुटि', कॉलबैक) है? – mikach

+2

कैश के बारे में क्या? –

135

मैं इस एक छोटे से इतना है कि कस्टम $scope तरीकों कहा जा सकता है संशोधित:

<img ng-src="{{src}}" imageonload="doThis()" /> 

निर्देश:

.directive('imageonload', function() { 
     return { 
      restrict: 'A', 
      link: function(scope, element, attrs) { 
       element.bind('load', function() { 
        //call the function that was passed 
        scope.$apply(attrs.imageonload); 
       }); 
      } 
     }; 
    }) 

आशा है कि किसी को यह बहुत उपयोगी लगेगा। धन्यवाद @mikach

doThis() समारोह तो एक $ गुंजाइश विधि

+2

यह सही है। मिकाच का समाधान तब तक मेरे लिए काम नहीं करता जब तक कि मैंने $ लागू नहीं किया() जैसा आपने किया था। –

+0

यह प्रदान किए गए उत्तरों का सबसे अच्छा है। पूरी तरह से किसी भी JQUERY लोडिंग की आवश्यकता को समाप्त करता है। –

+0

सेमी-कोलों को डालने के लिए धन्यवाद ताकि लिंट विस्फोट न हो। – richard

9

@ ओलेग टिकोनोव होगा: बस पिछले कोड .. अद्यतन @ mikach धन्यवाद ..)

app.directive('imageonload', function() { 
    return { 
    restrict: 'A', 
    link: function(scope, element, attrs) { 
     element.bind('load', function() { 
      alert('image is loaded'); 
     }); 
     element.bind('error', function(){ 
      alert('image could not be loaded'); 
     }); 
    } 
    }; 
}); 
+0

एक 'imageonerror' निर्देश में यह बेहतर हो सकता है ताकि आप एक अलग कार्रवाई कर सकें। –

4

बस पिछले अद्यतन कोड ..

<img ng-src="{{urlImg}}" imageonload="myOnLoadImagenFunction"> 

और निर्देश ...

.directive('imageonload', function() { 
     return { 
      restrict: 'A', 
      link: function(scope, element, attrs) { 
       element.bind('load', function() { 
        scope.$apply(attrs.imageonload)(true); 
       }); 
       element.bind('error', function(){ 
        scope.$apply(attrs.imageonload)(false); 
       }); 
      } 
     }; 
    }) 
0

असल में यह समाधान है जिसका उपयोग मैंने समाप्त किया।

$ लागू() केवल सही परिस्थितियों में बाह्य स्रोतों द्वारा उपयोग किया जाना चाहिए।

इसके बजाय आवेदन का उपयोग करके, मैंने कॉल स्टैक के अंत में अपडेट करने के दायरे को फेंक दिया है। "स्कोप। $ लागू (attrs.imageonload) (सत्य) के रूप में अच्छा काम करता है;"।

window.app.directive("onImageload", ["$timeout", function($timeout) { 

    function timeOut(value, scope) { 
     $timeout(function() { 
      scope.imageLoaded = value; 
     }); 
    } 

    return { 
     restrict: 'A', 
     link: function(scope, element, attrs) { 
      element.bind('load', function() { 
       timeOut(true, scope); 
      }).bind('error', function() { 
       timeOut(false, scope); 
      }); 
     } 
    }; 

}]); 
+0

"$ $ लागू() 'का अर्थ केवल बाहरी स्रोतों द्वारा ही किया जाना चाहिए"? मैं पीछा नहीं कर रहा हूँ। – genuinefafa

+0

@genuinefafa 'बाहरी स्रोत' द्वारा उसका क्या अर्थ है गैर-कोणीय कोड है। तो उदाहरण के लिए यदि आप जेनेरिक जेएस इवेंट श्रोता का उपयोग कोड में कॉल करने के लिए कर रहे हैं जो $ स्कोप बदलता है, तो आपको वहां $ लागू करने की आवश्यकता होगी। लेकिन अगर यह एक कोणीय घटना या $ स्कोप फ़ंक्शन है तो आपको $ आवेदन की आवश्यकता नहीं है क्योंकि $ पाचन चक्र पहले से ही कोणीय तरीकों से चल रहा है। – tpartee

1

मेरा जवाब:

var img = new Image(); 
var imgUrl = "path_to_image.jpg"; 
img.src = imgUrl; 
img.onload = function() { 
     $scope.pic = img.src; 
}