2012-09-10 14 views
15

मैं सर्वर से आवश्यक डेटा तक पहुंचने तक नियंत्रक के प्रारंभ में देरी करना चाहता हूं।Angular.js नियंत्रक प्रारंभ में देरी

मैं कोणीय 1.0.1 के लिए इस समाधान पाया: Delaying AngularJS route change until model loaded to prevent flicker, लेकिन यह कोणीय 1.1.0

खाका के साथ नहीं काम कर रहा हो सकता है

<script type="text/ng-template" id="/editor-tpl.html"> 
Editor Template {{datasets}} 
</script> 
    <div ng-view> 
</div> 

जावास्क्रिप्ट

function MyCtrl($scope) {  
    $scope.datasets = "initial value"; 
} 

MyCtrl.resolve = { 
    datasets : function($q, $http, $location) { 
     var deferred = $q.defer(); 

     //use setTimeout instead of $http.get to simulate waiting for reply from server 
     setTimeout(function(){ 
      console.log("whatever"); 
      deferred.resolve("updated value"); 
     }, 2000); 

     return deferred.promise; 
    } 
}; 

var myApp = angular.module('myApp', [], function($routeProvider) { 
    $routeProvider.when('/', { 
     templateUrl: '/editor-tpl.html', 
     controller: MyCtrl, 
     resolve: MyCtrl.resolve 
    }); 
});​ 

http://jsfiddle.net/dTJ9N/1/

उत्तर

11

काम करना चाहिए, यह एक प्रदर्शन हिट अपनी खुद की बस वादा वापस जाने के लिए जब http डेटा आता टाल बनाने के लिए है। आप ऐसा करने में सक्षम होना चाहिए:

MyCtrl.resolve = { 
    datasets: function ($http) { 
     return $http({method: 'GET', url: '/someUrl'}); 
    } 
}; 

आप परिणाम से कुछ प्रसंस्करण करने की जरूरत है, तो तब का उपयोग करें, और अपने वादे को मुक्त करने के लिए में श्रृंखलित है:

MyCtrl.resolve = { 
    datasets: function ($http) { 
     return $http({method: 'GET', url: '/someUrl'}) 
       .then (function (data) { 
        return frob (data); 
       }); 
    } 
}; 
+0

कार्य उदाहरण: http://jsfiddle.net/dTJ9N/5 – mb21

+10

मैं कहूंगा इस मामले में एक और वादे के साथ $ http के वादे को लपेटने के लिए प्रदर्शन हिट इतना छोटा है कि चिंता करने योग्य नहीं है। हालांकि, अतिरिक्त वादे के बहिष्कार के परिणामस्वरूप अधिक संक्षिप्त कोड एक योग्य प्रयास है। –

+0

कोड अच्छा और साफ है, लेकिन आज के रूप में, पहेली टूटा हुआ है, दस्तावेज़ स्रोत दिखाता है। कोणीय को बहुत नया यह ध्यान देने से परे बहुत मदद करने के लिए। – enigment

1

आप एक के पास समान प्रश्न here संसाधनों का उपयोग करता है पर एक नज़र ले जा सकते हैं, लेकिन यह $ http के साथ उसी तरह काम करता है। मुझे लगता है कि जब से $ http एक वादा रिटर्न इस

function MyCtrl($scope, datasets) {  
    $scope.datasets = datasets; 
} 

MyCtrl.resolve = { 
    datasets: function($http, $q) { 
     var deferred = $q.defer(); 

     $http({method: 'GET', url: '/someUrl'}) 
      .success(function(data) { 
       deferred.resolve(data) 
     } 

     return deferred.promise; 
    } 
}; 

var myApp = angular.module('myApp', [], function($routeProvider) { 
    $routeProvider.when('/', { 
     templateUrl: '/editor-tpl.html', 
     controller: MyCtrl, 
     resolve: MyCtrl.resolve 
    }); 
});​ 
+0

धन्यवाद, एक वाक्यविन्यास त्रुटि या दो तय की गई, यहां कामकाजी कोड: http://jsfiddle.net/dTJ9N/2/ – mb21

4

तुम हमेशा सिर्फ डाल सकता है बाहरी-डीओएम तत्व पर "एनजी-शो" और उस डेटा के बराबर सेट करें जिसके लिए आप प्रतीक्षा करना चाहते हैं।

कोणीय जे एस मुख पृष्ठ आप देख सकते हैं कितना आसान है पर सूचीबद्ध उदाहरण के लिए: http://plnkr.co/CQu8QB94Ra687IK6KgHn सब किया जाना था था इस तरह के फार्म नहीं दिखाया जाएगा जब तक कि मूल्य निर्धारित किया गया है।

इस तरह से अधिक सहज और कम काम करते हैं।

+0

यदि आपके पास एकाधिक डेटा लोड हैं तो क्या होगा? आप नहीं जानते कि कौन सा पूरा होगा क्योंकि वे सभी एसिन चलाते हैं। उदाहरण के लिए ... मान लें कि मुझे चुनिंदा बॉक्स में दिखाने के लिए 5 विकल्प और पहले विकल्प से संबंधित सभी डेटा की आवश्यकता है, इसलिए मैं फॉर्म को प्रीलोड कर सकता हूं ??? – Jason

+0

यदि आपको पांच मिल गया है, कोई समस्या नहीं है, प्रत्येक लोड के बाद बस नोट करें और एक बार सभी पांच खुश हो जाएं। आपको केवल एक सरणी के साथ कुछ चर होना चाहिए और जांचें कि प्रत्येक डेटा लोड में लंबाई के बाद लंबाई 5 है और 5 के बाद एक और चर सेट करें जो एनजी-शो आधारित है और अपनी गिनती सरणी को रीसेट करें। – stormlifter

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