在使用内联数组注释和流畅API定义的控制器上使用ui-router的解析

时间:2014-08-21 07:48:51

标签: javascript angularjs angular-ui-router

我曾经用inline array notation来定义角度控制器,例如:

angular
  .controller('SomeCtrl', [ '$scope', function($scope) {
    ...
}])

我也更喜欢角度模块的流畅API,即在我定义控制器的文件顶部只有一个angular.module调用,其他所有内容都链接到此调用。

我现在想使用ui-router的解析功能,并保持控制器与控制器的依赖关系,而不是路由器(请参阅recommendations on routing resolves)。

有没有办法继续使用我的首选方法(内联数组表示法,流畅的API)以及ui-router解决方案的建议?我目前的理解是angular.controller定义了控制器的构造函数,所以为了在控制器上有一个额外的resolve()方法,我必须传入一个已经有这个方法的对象加上一个构造函数。

更新:添加代码示例。

路线:

function config ($routeProvider) {
  $routeProvider
  .when('/myroute', {
    templateUrl: 'views/some.html',
    controller: 'SomeCtrl'
    resolve: SomeCtrl.resolve
  });
}

控制器:

angular
  .controller('SomeCtrl', [ '$scope', 'SomeService', function($scope, SomeService) {
    var data = SomeService.data;
...
}])

其中SomeService.data()是返回我需要解决的promise的方法调用。如何使用我喜欢的方法定义解析?

SomeCtrl.resolve = {
  data: function(SomeService) {
    return SomeService.data();
  }
};

1 个答案:

答案 0 :(得分:1)

您可以继续使用内联注释。您只需要一个要解析的模型名称的注释。

因此,如果你的解决方案有一个名为getPromise的方法,你的内联控制器DI注释应该包含字符串'getPromise'。

<强>更新

因此,使用您的代码示例,您应该进行以下更改。

将“解析注释”添加到您的解析对象:

SomeCtrl.resolve = {

  'SomeService': SomeService,  

  someData: ['SomeService', function(SomeService) {
    return SomeService.data();
  }]
};

为resolve方法添加注释。我已将其从示例中的“数据”更改为“someData”:

angular
  .controller('SomeCtrl', [ '$scope', 'someData', function($scope, someData) {
     var data = someData;
     ...
}])

另一个更新

确定。我想我现在明白了这个问题。

您不需要使用SomeCtrl.resolve定义uiRouter解析。

您可以在模块配置部分中定义内联解析:

function config ($routeProvider) {
  $routeProvider
  .when('/myroute', {
    templateUrl: 'views/some.html',
    controller: 'SomeCtrl'
    resolve:  {
           'SomeService': SomeService,  
           someData: ['SomeService', function(SomeService) {
               return SomeService.data();
           }]
       }
  });
}

或者,如果你想获得幻想,你可以为你的每个州创建一个带有键的解析对象,然后做一些事情:

...
resolve: myResolveObj.someState
...