如何在控制器在加载视图时使用服务对象之前实例化服务中的某些对象

时间:2016-02-16 08:30:30

标签: angularjs angular-ui-router oclazyload

我有一个stateprovider,可以加载视图和设置控制器。现在控制器依赖于应该提供更新对象的服务。例如,我有一个状态-s,模板v和控制器c。 c取决于服务。 s有方法-lets说' sm'从AJAX获取数据。现在我想要' sm'仅在加载状态但在实例化控制器之前调用。

我知道可以使用resolve完成,但是如何在实例化控制器之前命令加载服务方法。

我正在使用基于oclazylaod的功能' loadSequence'它按特定顺序加载脚本。

离。

.state('member.course', {
       url: "/course",
       templateUrl: "assets/views/course.html",
       controller: 'coursecontroller',
       resolve: loadSequence('someservice', 'coursecontroller', 'toaster', 'ngImgCrop'),
       data: {
         css: 'assets/css/course.css'
       }
     })

我希望在我的' courseController'之前调用someservice.getData方法。已加载。怎么做?

Edit- loadSequence;: -

 function loadSequence() {
     var _args = arguments;
     return {
       deps: ['$ocLazyLoad', '$q',
         function($ocLL, $q) {
           var promise = $q.when(1);
           for (var i = 0, len = _args.length; i < len; i++) {
             promise = promiseThen(_args[i]);
           }
           return promise;

           function promiseThen(_arg) {
             if (typeof _arg == 'function')
               return promise.then(_arg);
             else
               return promise.then(function() {
                 var nowLoad = requiredData(_arg);
                 if (!nowLoad)
                   return $.error('Route resolve: Bad resource name [' + _arg + ']');
                 return $ocLL.load(nowLoad);
               });
           }

           function requiredData(name) {
             if (jsRequires.modules)
               for (var m in jsRequires.modules)
                 if (jsRequires.modules[m].name && jsRequires.modules[m].name === name)
                   return jsRequires.modules[m];
             return jsRequires.scripts && jsRequires.scripts[name];
           }
         }
       ]
     };
   }

1 个答案:

答案 0 :(得分:0)

我之前遇到过同样的情况,这就是我解决问题的方法..

.state('member.course', {
       url: "/course",
       templateUrl: "assets/views/course.html",
       controller: 'coursecontroller',
        resolve: {
              b: ['someservice', function(someservice) {
                return someservice.getData();//as its a ajax request it will return a promise
              }],
              a: ['b', function(b) {
                return angular.element(document.body).injector().invoke(loadSequence('coursecontroller', 'toaster', 'ngImgCrop')['deps'])
              }]
            },
       data: {
         css: 'assets/css/course.css'
       }
     })