2017-02-22 34 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(){ 

}); 

Что я могу сделать, чтобы заставить контроллер должен быть зарегистрирован?

EDIT ПРИЛОЖЕНИЕ УСТАНАВЛИВАЕТСЯ И ВСЕ РАБОТЫ ИСКУССТВО. ЭТО ВОПРОС ОКАЗЫВАЕТ ТОЛЬКО ЛАЗИРОВАНИЕ.

Проблема точно такая же, как определено, контроллер не зарегистрирован, поскольку процесс начальной загрузки уже запущен. Я ищу способ зарегистрировать контроллер, когда он lazyloaded.

мой погрузчик функция ($util.load() выглядит так:

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. $ apply()' * после того, как * ваш загрузчик загрузится и выполнит ваш файл контроллера, но * до того, как оно вернется. вы также можете использовать модуль, предназначенный для этой задачи, например oc-lazyLoad. https://oclazyload.readme.io/docs/with-your-router – Claies

ответ

2

Я был в состоянии решить это сам по перекрывая angular.module() с пользовательской функцией, и в этой пользовательской функции я передать вызовы к appInstance.controller до $ controllerProvider .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 g контроллеры, директивы, компоненты, заводы, службы, значения, константы и фильтры:

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, у меня есть одна на github/bower checkout 'ng-util'. его не просто lazyloading либо, он делает все виды дерьма, как синхронные и асинхронные итераторы (очереди функций) с гарантированным возвратом заказов, а также некоторые случайные директивы и фильтры. все в около 2.8kb – r3wt

+0

Приятно слышать это, я искал что-то подобное из-за этого. Если у вас есть другой полезный пакет, не стесняйтесь ха-ха – Disfigure

 Смежные вопросы

  • Нет связанных вопросов^_^