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

前端之家收集整理的这篇文章主要介绍了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?

@H_404_21@

是的,只能在控制器上工作.

And if that is the case,how can I use a resolve inside a factory / service?

@H_404_21@

请记住,工厂和服务返回单例对象,即第一次将工厂注入控制器时,它会运行您提供的任何实例化代码并创建一个对象,然后在工厂实例化的任何后续时间返回相同的对象.

换一种说法:

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相关文章