1

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

我知道它可以通过解析来完成,但是如何在实例化控制器之前订购服务方法的加载。

我正在使用基于 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 方法。怎么做?

编辑-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];
           }
         }
       ]
     };
   }
4

1 回答 1

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'
       }
     })
于 2016-02-16T08:38:44.127 回答