22

角度コントローラーを書く私のスタイルは次のとおりです(関数の代わりにコントローラー名を使用)

angular.module('mymodule', [
])
    .controller('myController', [
        '$scope',
        function($scope) {
            // Some code here

        }
    ]);

私が今必要としているのは、解決部分を定義したい i ルートを提供するときです:

 $routeProvider.when('/someroute', {
        templateUrl: 'partials/someroute.html', 
        resolve: myController.resolve}) // THIS IS THE CRITICAL LINE

コントローラーは名前として定義されているため、以下の解決部分を達成する方法は?

詳細を明確にするために、ルートが解決される前にサーバーからデータをロードし、これらのデータをコントローラーで使用したいと考えています。

更新:より正確に言うと、各モジュールには、そのコントローラーでルートが実行される前に呼び出される「解決」関数が必要です。この投稿のソリューション(Misko Hevery による回答) は、まさに私が望むことを行いますが、コントローラーは関数としてではなく、名前として持っています。

4

4 に答える 4

24

コントローラ定義と解決部分は、ルート定義で別々に指定する必要があります。

モジュール レベルでコントローラーを定義する場合は、それらを文字列として参照する必要があるため、次のようになります。

 $routeProvider.when('/someroute', {
        templateUrl: 'partials/someroute.html', 
        controller: 'myController',
        resolve: {
          myVar: function(){
            //code to be executed before route change goes here
          };
        });

上記のコードは、ルートが変更される前に解決される一連の変数を定義する方法も示しています。解決されると、これらの変数をコントローラーに注入できるため、上記のスニペットの例を参考にして、コントローラーを次のように記述します。

.controller('myController', ['$scope', 'myVar', function($scope, myVar) {
            // myVar is already resolved and injected here
        }
    ]);

このビデオも役立つかもしれません: http://www.youtube.com/watch?v=P6KITGRQujQ

于 2013-02-20T13:52:39.287 に答える
13

@ pkozlowski.opensource の回答は機能しますが、ルーティングとコントローラーを台無しにしたくありません。これは、常に (Yo Generator から) 分離したままにしておくためです。実際には、controller と resolve(r) をすべてstring/name (関数ではない) として持つこともできます。

angular.module('mymodule', [
])
  .controller('myController', [
      '$scope', 'myModelCombination'
      function($scope, myModelCombination) {
          // myModelCombination[0] === (resolved) myModel 
          // myModelCombination[1] === (resolved) myModel2

      }
  ])
  .controller('myController2', [
      '$scope', 'myModel'
      function($scope, myModel) {
          // Some code here

      }
  ])
  .factory('myModel', [
      '$scope',
      function($scope) {
          // return a promise

      }
  ])
  .factory('myModel2', [
      '$scope',
      function($scope) {
          // return a promise

      }
  ])
  .factory('myModelCombination', [
      '$scope', 'myModel', 'myModel2'
      function($scope) {
          return $q.all(['myModel', 'myModel2']);

      }
  ]);

次に、ルーティングファイルにこれを追加する必要があります

$routeProvider.when('/someroute', {
    templateUrl: 'partials/someroute.html', 
    resolve: ['myModel'] //ALWAYS IN ARRAY)
});
$routeProvider.when('/myModelCombination', {
    templateUrl: 'partials/someroute2.html', 
    resolve: ['myModel'] //ALWAYS IN ARRAY)
});

http://docs.angularjs.org/api/ng .$routeProvider

于 2013-06-11T08:01:09.077 に答える
0

これもうまくいくだろう

var MyController = myApp.controller('MyController', ['$scope', 'myData', function($scope, myData) {
  // Some code here
}]);

MyController.resolve = {
  myData: ['$http', '$q', function($http, $q) {
    var defer = $q.defer();

    $http.get('/foo/bar')
      .success(function(data) {
        defer.resolve(data);
      })
      .error(function(error, status) {
        defer.reject(error);
      });

    return defer.promise;
  }]
};
于 2015-10-23T09:37:06.837 に答える