我有一个 UI Router 定义了这样的东西(为简单起见进行了 trim ):
$stateProvider
.state('someState', {
resolve: {
model: ['modelService', 'info', function (modelService, info) {
return modelService.get(info.id).$promise;
}]
},
controller: 'SomeController'
});
此 someState
状态正在使用依赖于该 model
解析的工厂/服务。它是这样定义的,AngularJS 在这里抛出一个 Unknown provider: modelProvider <- model <- someService 错误:
angular
.module('someModule')
.factory('someService', someService);
someService.$inject = ['model'];
function someService(model) { ... }
但是,在该状态的 Controller 内部使用相同的模型
解析工作正常:
SomeController.$inject = ['model'];
function SomeController(model) { ... }
所以我了解到 UI Router 正在延迟 SomeController
的 DI,直到解析发生,这使得 AngularJS 不会抛出错误。但是,当将该解决方案作为对 someService
的依赖项时,为什么没有发生相同的延迟?解析是否只适用于 Controller ?如果是这样,我如何在工厂/服务中使用解析?
最佳答案
Do resolves only work on controllers?
是的,解析只在 Controller 上工作。
And if that is the case, how can I use a resolve inside a factory / service?
请记住,工厂和服务返回单例对象,即第一次将工厂注入(inject) Controller 时,它会运行您提供的任何实例化代码并创建一个对象,然后在该工厂的任何后续时间被实例化,返回相同的对象。
换句话说:
angular.module('someModule')
.factory( 'SomeFactory' , function () {
// this code only runs once
object = {}
object.now = Date.now();
return object
);
SomeFactory.now
将是工厂第一次注入(inject) Controller 的当前时间,但它不会在后续使用时更新。
因此,工厂解决方案的概念实际上没有意义。如果您想要一个动态执行某些操作的服务(这显然很常见),您需要将逻辑放在单例上的函数中。
例如,在您提供的代码示例中,您的工厂依赖于一个模型。一种方法是使用您已经设置的解析方法将模型注入(inject) Controller ,然后在接受模型并执行您需要执行的操作的单例上公开一个方法,如下所示:
angular.module('someModule')
.factory( 'SomeFactory', function () {
return {
doSomethingWithModel: function (model) {
$http.post('wherever', model);
}
});
.controller('SomeController', function (SomeFactory, model) {
SomeFactory.doSomethingWithModel(model);
});
或者,如果您根本不需要 Controller 中的解析值,请不要将其直接放入解析中,而是将解析逻辑放入服务单例的方法中,并在解析中调用该方法,将结果传递给 Controller 。
抽象对话很难更详细,因此如果您需要进一步的指导,请提供具体的用例。
关于javascript - AngularJS UI 路由器在工厂/服务中使用已解析的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27891121/