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

标签 javascript angularjs angular-ui-router

我有一个 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/

相关文章:

javascript - 从 Angular js 中的复杂 JSON 数组获取值

javascript - Node.js mysql 连接和事务

javascript - Angular 和 UIGrid - 获取表数据

javascript - Angularjs - UI 路由器和 Bootstrap 选项卡

angularjs - $stateChangeSuccess 在 Controller 实例化后被解雇

javascript - 我该如何重构这段 JavaScript 代码?

javascript - Ext.data.NodeInterface 禁用属性

javascript - AngularJS:一键隐藏表单而不显示错误消息

angularjs - Angular ui指令作为属性

javascript - 跨页面异步通信