2017-02-22 19 views
9

मैं बहुत तरह नियंत्रकों लोड करना चाहते हैं:रजिस्टर lazyloaded नियंत्रक AngularJS

.state({ 
    name: 'app.search', 
    url: 'search?q&opts', 
    templateUrl: '/templates/search.html', 
    controller: 'SearchCtrl', 
    resolve: { 
     deps: function($util){ 
      return $util.load(['/ctrl/SearchCtrl.js']); 
     } 
    } 
}) 

नियंत्रक भार लेकिन मैं निम्नलिखित त्रुटि मिलती है, मुझे विश्वास है कि प्रमुख नियंत्रक पंजीकृत नहीं किया गया था:

Argument 'SearchCtrl' is not aNaNunction, got undefined

तो मेरा सवाल यह है कि, मैं इसे दिखाए जाने पर आलसी लोड करते समय नियंत्रक को पंजीकृत करने के बारे में कैसे जाउंगा।

नियंत्रक के रूप में परिभाषित किया गया है:

app.module('app').controller('SearchCtrl',function(){ 

}); 

क्या मैं नियंत्रक के लिए मजबूर कर सकते हैं पंजीकृत होने के लिए है?

संपादित करें एपीपी पहले से ही तैयार है और सभी काम ठीक हैं। यह प्रश्न केवल लॉजिंग करने के लिए है।

समस्या बिल्कुल परिभाषित है, नियंत्रक पंजीकृत नहीं है क्योंकि बूटस्ट्रैपिंग प्रक्रिया पहले ही चल चुकी है। जब मैं आलसी लोड हो जाता हूं तो मैं नियंत्रक को पंजीकृत करने के लिए कुछ रास्ता ढूंढ रहा हूं।

load: function(){ 

    if(arguments.length > 1){ 
     var items = arguments; 
    }else{ 
     var items = arguments[0]; 
    } 



    var _self = this; 

    return $q(function(resolve,reject){ 
     if(items.length == 0){ 
      return resolve(); 
     } 
     _self.async(items, function(item,next){ 
      if(item.indexOf('.js') != -1){ 
       _self.loadOne('script',item,next,function(err){ 
        next(err); 
       }); 
      } 
      else if(item.indexOf('.css') != -1){ 
       _self.loadOne('link',item,next); 
      }else{ 

       next(); 
      } 
     },function(errors,results){ 
      $timeout(function() { 
       $rootScope.$apply();// @Claies suggestion 
       if(errors){ 
        reject(errors); 
       }else{ 
        resolve(); 
       } 
      }); 
     }); 
    }); 

}, 
+0

क्या आपके पास एक मॉड्यूल अलग से घोषित किया गया है? – Sajeetharan

+0

ऐप मॉड्यूल? बेशक। यह ऐप पहले ही बनाया गया है, लेकिन सभी कोड एक ही फाइल में हैं। मैं अलग-अलग फाइलों और lazyload – r3wt

+1

में सभी कोड को विभाजित करने की कोशिश कर रहा हूं, आपको अपने लोडर लोड के बाद '$ rootScope। $ लागू()' * का उपयोग करना होगा और आपके कंट्रोलर फ़ाइल को निष्पादित करना होगा लेकिन * पहले * संकल्प वापस आ जाएगा। आप इस कार्य के लिए डिज़ाइन किए गए मॉड्यूल का भी उपयोग कर सकते हैं, जैसे oc-lazyLoad। https://oclazyload.readme.io/docs/with-your-router – Claies

उत्तर

2

मैं एक कस्टम समारोह के साथ angular.module() अधिभावी द्वारा इसे अपने आप को हल करने में सक्षम था, और इस कस्टम समारोह के भीतर मैं $ controllerProvider को appInstance.controller के लिए कॉल पारित:

मेरी लोडर समारोह ($util.load() इसलिए की तरह दिखता है .register()। यह, काम कर रहा है मुझे यकीन है कि यह कैसे उचित है नहीं कर रहा हूँ, लेकिन मैं वास्तव में जब तक कि यह कुछ भी नष्ट नहीं होती है के रूप में परवाह नहीं है।

var mod = angular.module('myModule',[]); //define my module 

mod.config(['$controllerProvider',function($controllerProvider){ 

    mod._cRegister = $controllerProvider;//store controllerProvider onto the app instance. 

    var mFunc = angular.module; // copy actual module function from angular 

    //override angular.module with custom function 
    angular.module = function(){ 

     var app = mFunc.apply(this,arguments);// proxy to the real angular.module function to get an app instance 

     var cFunc = app.controller;//copy actual controller function from app instance 

     app.controller = function(){ 

      mod._cRegister.register.apply(this,arguments); // try register on the controllerProvider instance as well 


      return this;//return app instance so user can chain calls or whatever. 

     }.bind(app); 

     return app;//return app instance, just as angular does. 

    }.bind(angular);  

}]); 

//rest of module code (including the loader) 

यह अच्छा काम करता है, लेकिन केवल नियंत्रकों के लिए निम्नलिखित एक पूर्ण उदाहरण coverin है जी नियंत्रक, निर्देश, घटक, कारखानों, सेवाओं, मूल्यों, स्थिरांक, और फ़िल्टर:

var mod = angular.module('myModule',[]); 

mod.config(['$controllerProvider','$compileProvider','$filterProvider','$provide',function($controllerProvider,$compileProvider,$filterProvider,$provide){ 

    mod.$controllerProvider = $controllerProvider; 
    mod.$compileProvider = $compileProvider; 
    mod.$filterProvider = $filterProvider; 
    mod.$provide = $provide; 

    var map = { 
     controller: ['$controllerProvider','register'], 
     filter: ['$filterProvider','register'], 
     service: ['$provide','service'], 
     factory: ['$provide','factory'], 
     value: ['$provide','value'], 
     constant: ['$provide','constant'], 
     directive: ['$compileProvider','directive'], 
     component: ['$compileProvider','component'] 
    }; 

    var bootStrapped = []; 

    var mFunc = angular.module; 

    angular.module = function(){ 

     var app = mFunc.apply(this,arguments); 

     //only override properties once. 
     if(bootStrapped.indexOf(arguments[0]) == -1){ 
      for(var type in map){ 

       var c = mod; 

       var d = map[type]; 

       for(var i=0;i<d.length;i++){ 
        c = c[d[i]];// recurse until reaching the function 
       } 
       //now inject the function into an IIFE so we ensure its scoped properly 
       !function(app,type,c){ 
        app[type] = function(){ 
         c.apply(this,arguments); 
         return this;//return the app instance for chaining. 
        }.bind(app);  
       }(app,type,c); 
      } 
      bootStrapped.push(arguments[0]);//mark this instance as properly monkey patched 
     } 

     return app; 

    }.bind(angular);  

}]); 
+1

पागल दोस्त: खुशी: अच्छी नौकरी! मैं इसे – Disfigure

+0

@ कोशिश करूँगा अगर आपको lazyloading के लिए एक छोटी लाइब्रेरी की ज़रूरत है तो मुझे गिटब/बॉवर चेकआउट 'एनजी-यूटिल' पैकेज पर एक मिल गया है। यह सिर्फ lazyloading नहीं है, यह सभी प्रकार की बकवास करता है, जैसे सिंक्रोनस और एसिंक्रोनस इटरेटर्स (फ़ंक्शन कतार) गारंटीकृत रिटर्न ऑर्डर के साथ, और कुछ यादृच्छिक निर्देश और फ़िल्टर। सब कुछ 2.8kb – r3wt

+0

में यह सुनकर अच्छा लगा, मैं थोड़ी देर के बाद ऐसा कुछ ढूंढ रहा हूं। यदि आपके पास कोई अन्य उपयोगी पैकेज है तो हाहा में संकोच नहीं करें – Disfigure

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