javascript – AngularJS UI路由器在工厂/服务中使用已解析的依赖项

我有一个UI路由器定义类似这样(为简单起见修剪):

    $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);
});

或者,如果您根本不需要控制器中的已解析值,请不要将其直接放在解析中,而是将解析逻辑放入服务单例的方法中,并在解析内调用该方法,并传递结果到控制器.

抽象对话很难更详细,所以如果你需要进一步的指针,那么提供一个特定的用例.

转载注明原文:javascript – AngularJS UI路由器在工厂/服务中使用已解析的依赖项 - 代码日志