$stateProvider .state('someState',{ resolve: { model: ['modelService','info',function (modelService,info) { return modelService.get(info.id).$promise; }] },controller: 'SomeController' });
此someState状态正在使用依赖于该模型解析的工厂/服务.它的定义是这样的,AngularJS抛出一个未知的提供者:modelProvider< - model< - someService错误:
angular .module('someModule') .factory('someService',someService); someService.$inject = ['model']; function someService(model) { ... }
但是,使用相同的模型解析此状态的控制器内部工作正常:
SomeController.$inject = ['model']; function SomeController(model) { ... }
所以我理解UI路由器正在推迟SomeController的DI,直到解决方案发生,这允许AngularJS不会抛出错误.但是,如果将该解决方案作为对某个服务的依赖,那么为什么不会发生相同的延迟呢?解析只能在控制器上工作吗?如果是这种情况,我如何在工厂/服务中使用解决方案?
解决方法
Do resolves only work on controllers?
是的,只能在控制器上工作.
And if that is the case,how can I use a resolve inside a factory / service?
请记住,工厂和服务返回单例对象,即第一次将工厂注入控制器时,它会运行您提供的任何实例化代码并创建一个对象,然后在工厂实例化的任何后续时间返回相同的对象.
换一种说法:
angular.module('someModule') .factory( 'SomeFactory',function () { // this code only runs once object = {} object.now = Date.now(); return object );
SomeFactory.now将是工厂第一次注入控制器的当前时间,但在后续使用时不会更新.
因此,工厂决心的概念并不真正有意义.如果你想拥有一个动态地做某事的服务(这显然很常见),你需要将逻辑放在单例的函数内.
例如,在您提供的代码示例中,您的工厂依赖于模型.一种方法是使用您已经设置的解析方法将模型注入控制器,然后在接受模型的单例上公开一个方法并执行您需要执行的操作,如下所示:
angular.module('someModule') .factory( 'SomeFactory',function () { return { doSomethingWithModel: function (model) { $http.post('wherever',model); } }); .controller('SomeController',function (SomeFactory,model) { SomeFactory.doSomethingWithModel(model); });
或者,如果您根本不需要控制器中的已解析值,请不要将其直接放在解析中,而是将解析逻辑放入服务单例的方法中,并在解析内调用该方法,并传递结果到控制器.
抽象对话很难更详细,所以如果你需要进一步的指针,那么提供一个特定的用例.