1

ビューとセットアップコントローラーをロードするステートプロバイダーがあります。現在、コントローラーは、更新されたオブジェクトを提供するサービスに依存しています。たとえば、状態-s、テンプレートv、およびコントローラーcがあります。c はサービス s に依存します。s には、AJAX からデータをフェッチする「sm」というメソッドがあります。ここで、「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 メソッドを呼び出す必要があります。どうやってするの?

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];
           }
         }
       ]
     };
   }
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 に答える