AngularJS UI Router 在工厂/服务中使用解析的依赖关系

2024-01-11

我有一个 UI Router 定义如下(为简单起见进行了修剪):

    $stateProvider
        .state('someState', {
            resolve: {
                model: ['modelService', 'info', function (modelService, info) {
                    return modelService.get(info.id).$promise;
                }]
            },
            controller: 'SomeController'
        });

This someState状态正在使用依赖于此的工厂/服务model解决。它的定义是这样的,AngularJS 抛出一个未知提供者: modelProvider 此处错误:

angular
    .module('someModule')
    .factory('someService', someService);

someService.$inject = ['model'];
function someService(model) { ... }

然而,使用相同的model在该状态控制器内部解析工作正常:

SomeController.$inject = ['model'];
function SomeController(model) { ... }

所以我知道 UI Router 正在延迟 DISomeController直到解析发生,这使得 AngularJS 不会抛出错误。但是,当将该解析作为依赖项时,为什么不会发生相同的延迟someService?解析仅适用于控制器吗?如果是这种情况,我如何在工厂/服务内使用解析?


解析仅适用于控制器吗?

是的,解析仅适用于控制器。

如果是这种情况,我如何在工厂/服务内使用解析?

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

换句话说:

angular.module('someModule')
.factory( 'SomeFactory' , function () {
  // this code only runs once
  object = {}
  object.now = Date.now();
  return object
);

SomeFactory.now将是工厂第一次注入控制器的当前时间,但它not更新后续使用情况。

因此,工厂的决心概念并没有真正的意义。如果您想要一个动态执行某些操作的服务(这显然很常见),您需要将逻辑放在单例的函数内。

例如,在您提供的代码示例中,您的工厂依赖于一个模型。一种方法是使用您已经设置的解析方法将模型注入到控制器中,然后在单例上公开一个接受模型并执行您需要执行的操作的方法,如下所示:

angular.module('someModule')
.factory( 'SomeFactory', function () {
  return {
    doSomethingWithModel: function (model) {
      $http.post('wherever', model);
  }
});
.controller('SomeController', function (SomeFactory, model) {
  SomeFactory.doSomethingWithModel(model);
});

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

抽象对话很难变得更详细,因此如果您需要进一步的指导,请提供特定的用例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AngularJS UI Router 在工厂/服务中使用解析的依赖关系 的相关文章

随机推荐