Angularjs将控制器解析为字符串

And*_*rin 21 angularjs

我写角度控制器的风格是这样的(使用控制器名称代替功能)

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

        }
    ]);
Run Code Online (Sandbox Code Playgroud)

我现在需要的是提供i路由我想要定义解析部分:

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

由于控制器被定义为如何完成解决部分的名称?

为了更详细地说明,我想在解决路由之前从服务器加载一些数据,然后在控制器中使用这些数据.

更新:更确切地说,我希望每个模块都有其"解析"功能,该功能将在执行该控制器的root之前调用.这篇文章中的解决方案(由Misko Hevery回答)完全符合我的要求,但我没有控制器作为功能,而是作为名称.

pko*_*rce 23

控制器定义和解析部分将在路径定义上单独指定.

如果在模块级别定义控制器,则需要将它们作为字符串引用,因此:

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

上面的代码还显示了如何定义一组将在路由更改之前解析的变量.解决后,这些变量可以注入控制器,所以从上面的代码片段中取出示例,你可以编写你的控制器:

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

此视频也可能有所帮助:http://www.youtube.com/watch?v = P6KITGRQujQ


Tru*_*inh 13

@pkozlowski.opensource的答案有效,但我真的不想搞砸我的路由和控制器,因为我总是把它分开(来自Yo Generator).实际上,我们也可以将控制器和解析(r)全部作为string/ name(NOT函数).

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']);

      }
  ]);
Run Code Online (Sandbox Code Playgroud)

然后在您的路由文件中添加

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

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

  • myModel工厂应该返回承诺?那么如何通过单一工厂(在本例中为myModel)返回更多承诺?或者我应该为每一个决心创造新的工厂. (2认同)