2016-01-26 7 views
12

मेरे पास निम्नलिखित ng-repeat है जो $http.post से डेटा प्राप्त करता है और इसे $scope.data में संग्रहीत करता है।Angularjs div पृष्ठभूमि तक प्रतीक्षा करें- छवि

<div ng-repeat="key in [] | range:data.pages"> 
    <div class="pageBackground" id="page_{{ (key+1) }}" ng-style="{'background-image':'url(/images/{{data.id}}/{{(key+1)}}.png)'}"> 
    <!-- some random stuff here --> 
</div> 

सामान्य क्या होता है .pageBackground कक्षा से पहले पृष्ठभूमि छवि स्क्रीन पर करता लोड होगा है। मुझे background-image वास्तव में लोड होने तक दिखाने के लिए कुछ भी नहीं चाहिए लेकिन मैं इसे समझने में सक्षम नहीं हूं।

क्या किसी के पास कोई सुझाव है?

+0

क्या आपने इस दृष्टिकोण की कोशिश की है? [Agular @ StackOverflow में छवियों की लोडिंग में देरी का सबसे आसान तरीका] (http://stackoverflow.com/questions/20229606/what-is-the-easiest-way-to-delay-loading-of-images-in-angular) – SL8t7

+0

क्या आप एक plnkr बना सकते हैं जो इस समस्या को पुन: उत्पन्न करता है? ऐसा लगता है कि @ sp00m का जवाब काम करना चाहिए। –

उत्तर

0

छवि लोड होने तक आप अपने स्टार्टअप फ़ंक्शन में देरी कर सकते हैं।

var img = new Image(); 
    img.onload = function(){ 
    loadData(); 
    }; 
    img.src = 'https://mdn.mozillademos.org/files/5397/rhino.jpg'; 

फिर html में एक ng-if="imageLoaded" रख दिया और सेट कि loadData समारोह में सच करने के लिए।

+0

पृष्ठों/छवियों की मात्रा कभी परिभाषित नहीं की जाती है और छवियां हमेशा एक अलग स्रोत से आती रहेंगी। यह विधि मेरे उदाहरण के लिए थोड़ा कठिन लगती है लेकिन सिफारिश के लिए धन्यवाद। – bryan

5

मुझे यकीन नहीं है कि आपकी समस्या का वास्तविक समाधान है। this answer में बताया गया है कि Image ऑब्जेक्ट का उपयोग करने के लिए एक कामकाज हो सकता है। एक निर्देश के रूप में उदाहरण के लिए:

angular.module("yourModule").directive("showOnceBackgroundLoaded", [function() { 
    return { 
    restrict: "A", 
    scope: false, 
    link: function (scope, element, attributes) { 
     element.addClass("ng-hide"); 
     var image = new Image(); 
     image.onload = function() { 
     // the image must have been cached by the browser, so it should load quickly 
     scope.$apply(function() { 
      element.css({ backgroundImage: 'url("' + attributes.showOnceBackgroundLoaded + '")' }); 
      element.removeClass("ng-hide"); 
     }); 
     }; 
     image.src = attributes.showOnceBackgroundLoaded; 
    } 
    }; 
}]); 

उपयोग:

<div ng-repeat="key in [] | range:data.pages"> 
    <div class="pageBackground" id="page_{{ (key+1) }}" show-once-background-loaded="/images/{{data.id}}/{{(key+1)}}.png"> 
    <!-- some random stuff here --> 
</div> 
+0

सहायता के लिए धन्यवाद लेकिन यह काम नहीं कर रहा है। एक बार div प्रकट होने के बाद, पृष्ठभूमि-छवि अभी भी – bryan

0

यहाँ एक निर्देश है कि एक पृष्ठभूमि के रूप में अपनी छवि को एम्बेड करता है, और जब तक के बाद छवि के लोड होते ही अपने आप को दिखाने के लिए इंतजार कर रहा है है। आप विभिन्न छवियों (जैसे एनजी-दोहराना के भीतर) उत्पन्न करने के लिए आवश्यक "mysrc" पैरामीटर के अंदर चर शामिल कर सकते हैं।

angular.module('foo', []) 
 
    .directive('myPageBackground', function() { 
 
    return { 
 
     scope: { 
 
     key: '=', // used for ID of the element; if you set the ID externally to the directive you could omit this 
 
     mysrc: '=' // used for the URL of the desired background image 
 
     }, 
 
     template: '<div ng-show="showMe" class="pageBackground" id="page_{{key}}" ng-style="{\'background-image\':\'url({{mysrc}})\'}"></div>', 
 
     link: function(scope) { 
 
     var img = new Image(); 
 
     img.onload = function() { 
 
      scope.showMe = true; 
 
      scope.$apply(); 
 
     }; 
 
     img.src = scope.mysrc; 
 
     } 
 
    } 
 
    });
.pageBackground { 
 
    width: 200px; height: 200px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="foo"> 
 
    <!-- Done with hardcoded values here, just for demo: --> 
 
    <div my-page-background key="'1'" mysrc="'http://placehold.it/200x200'"></div> 
 
    <div my-page-background key="'2'" mysrc="'http://placehold.it/150x150'"></div> 
 
    <div my-page-background key="'3'" mysrc="'http://placehold.it/100x100'"></div> 
 
</div>

0

आप हमेशा एक ही class="pageBackground" का उपयोग कर रहे हैं, तो आप पृष्ठभूमि छवि हमेशा एक ही है। तुम्हें पता है, छिपा छवि में लोड कर सकते हैं ताकि ब्राउज़र यह कैश:

<img src="url" style="display:none;"/> 

या पृष्ठ लोड पर जावास्क्रिप्ट के साथ प्रीलोड:

var img = new Image(); 
img.src = 'some url'; 

मेरा मानना ​​है कि, उस पोस्ट उपयोगकर्ता बातचीत है, जो निश्चित रूप से होता है के साथ शुरू हो रहा है पृष्ठ लोड होने के बाद, इसलिए छवि पहले से ही ब्राउज़र में बैठती है और जब आप class="pageBackground"

लागू होने पर यह तुरंत दिखाई देगा!

+0

दिखाई देने में देरी हो रही है कक्षा हमेशा समान होती है लेकिन यदि आप मेरा कोड देखते हैं, तो 'पृष्ठभूमि-छवि' विशेषता 'ng-style' – bryan

+0

@bryan क्षमा करें, याद किया कि, मेरा बुरा! –

0

आप एक div के बजाय ngSrc निर्देश का उपयोग कर सकते हैं। इसके अलावा, आप ng-lazy-img जैसे छोटे आलसी लोडिंग छवि लाइब्रेरी का उपयोग करने का प्रयास कर सकते हैं।

मुझे उम्मीद है कि इससे मदद मिलती है!

0

छवि ऑब्जेक्ट का उपयोग करके यहां एक पूर्ण-कार्य करने वाला उदाहरण है।

function AppCtrl($scope) { 
 
    $scope.images = [{ 
 
    src: 'https://farm4.staticflickr.com/3261/2801924702_ffbdeda927_d.jpg' 
 
    }, { 
 
    src: 'https://farm9.staticflickr.com/8455/8048926748_1bc624e5c9_d.jpg' 
 
    }]; 
 
    angular.forEach($scope.images, function(image) { 
 
    var img = new Image(); 
 
    img.onload = function() { 
 
     $scope.$apply(function() { 
 
     image.loadedSrc = image.src; 
 
     }); 
 
    }; 
 
    img.src = image.src; 
 
    }); 
 
}
.hasSrc { 
 
    color: purple; 
 
    padding: 10px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app> 
 
    <div ng-controller="AppCtrl"> 
 
    <div ng-repeat="image in images" ng-class="{ hasSrc: !!image.loadedSrc }" style="background-image: url({{image.loadedSrc}})"> 
 
     <h2>THIS IS SOME TEXT BEING USED</h2> 
 
     <p> 
 
     This text is being used for illustration purposes only. 
 
     </p> 
 
    </div> 
 
    </div> 
 
</div>

यह बहुत आसान अपने उद्देश्यों के अनुरूप करने के लिए यह अनुकूल करने के लिए होना चाहिए।

0

आप कोणीय वादों से मदद ले सकते हैं। अगर छवि को वादा किया गया है तो वादा किया गया है और देखें नहीं।

आप पहले से ही इस लिंक को चेक कर सकते हैं।

preloading-images-in-angularjs-with-promises

धन्यवाद

1

एक समाधान के लिए यहाँ देखो:

How can I tell when a CSS background image has loaded? Is an event fired?

आप क्या करते हैं आप एक अदृश्य साथी तत्व एक ही छवि लोड पैदा करते हैं। अगर और केवल अगर वह छवि लोड हो गई है (ऑनलोड ईवेंट) तो आप अपना अन्य तत्व दिखाते हैं, उदाहरण के लिए:

<div ng-repeat="key in [] | range:data.pages" ng-init="_imageLoaded={}"> 
    <div ng-show="_imageLoaded[$index]" class="pageBackground" id="page_{{ (key+1) }}" ng-style="{'background-image':'url(/images/{{data.id}}/{{(key+1)}}.png)'}"> 
    <img ng-show="false" src="/images/{{data.id}}/{{(key+1)}}.png" onload="_imageLoaded[$index] = true;" /> 
    <!-- some random stuff here --> 
</div> 
+0

हे पैट्रिक, प्रतिक्रिया के लिए धन्यवाद। मुझे यकीन नहीं है कि '_imageLoaded = {}' क्या आ रहा है। वैसे भी आप एम और संदर्भ दे सकते हैं। ये प्रश्न मुझे बहुत मदद नहीं करते हैं: \ – bryan

+0

अरे, मैं छवि लोड किए गए ऑब्जेक्ट का उपयोग प्रत्येक प्रविष्टि के लिए रीमेबर करने के लिए करता हूं यदि संबंधित छवि लोड हो गई हो। तो _imageLoaded.0 को पहले स्थान पर अपरिभाषित किया जाएगा - लेकिन जब $ index = 0 के साथ छवि लोड हो जाती है तो यह प्रविष्टि को सत्य में डाल देगी - यह ऑनलोड फ़ंक्शन में होती है। दूसरी ओर आपके div में इस चर के लिए एक एनजी-शो "सुनना" है। इसलिए जब यह अपरिभाषित से सत्य तक स्विच करता है तो div पॉप अप हो जाएगा। जो तब होता है जब छवि लोड हो जाती है, इसलिए आप जो पूछ रहे थे। _imageLoaded इसे लागू करने का एक ही तरीका है –

संबंधित मुद्दे