我曾经用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();
}
};
答案 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
...