【问题标题】:Ember's *needs* dependenciesEmber 的*需要*依赖项
【发布时间】:2014-07-21 20:27:20
【问题描述】:

我有一个由几个步骤组成的注册流程,我希望将状态存储在服务中,每个步骤的每个控制器都可以访问该服务。

我能够让这个工作,但在某种程度上似乎与 Ember 的做事方式不相符。我不得不添加一个初始化器,而不是设置控制器的 needs: 值,它包含以下内容:

export default {
  name: 'signup-state',
  initialize: function(container, app) {

    app.inject('controller:signup/index',   'signup-state', 'service:signup-state');
    app.inject('controller:signup/method',  'signup-state', 'service:signup-state');

    app.inject('route:signup/method', 'signup-state', 'service:signup-state');
  }
};

以上内容基于 wycats 在讨论板 [1] 上的评论。

这样做似乎是错误的。我认为needs 控制器会处理这个问题。因此,如果这完全是错误的,请在这里阻止我,因为这样做可能会解决问题。

上述方法有效,但需要测试控制器时除外。当我调用控制器上的方法时,该方法调用服务上的方法,我得到一个错误。

这是控制器代码

export default Ember.Controller.extend({

  /**
   * Reference to the signup-state service => initializers/signup-state.js
   */
  setState: function(key, val) {
    var state = this.get('signup-state');
    state.set(key, val);   <== state is undefined in tests
  },

  actions: {
    signupAsAdmin: function() {
      this.setState('userType', 'admin');
      this.transitionToRoute('signup.method');
    }
  }

});

这是控制器测试代码

import { test, moduleFor } from 'ember-qunit';

moduleFor('controller:signup/index', 'SignupController', {
  needs: ['service:signup-state']
});

test('signing up as an admin set the userType state to admin', function() {
  var controller = this.subject();

  // blows up here => Cannot read property 'set' of undefined
  controller.send('signupAsAdmin');
});

在控制器中调用 signupAsAdmin 函数会导致对服务对象进行 set 调用,从而导致“未定义”错误。

初始化程序代码通过添加 console.log 语句运行,但似乎不会导致在测试期间使服务对控制器可用。

感谢任何帮助。

注意:我使用的是 ember-cli,所以我没有可用的全局 App 变量。

更新手动注册(我认为 ember-cli 正在做的事情)确实有效。

export default {
  name: 'signup-state',
  initialize: function(container, app) {

    app.register('service:signup-state', 'signup-state');

    // Remove Injects
    // app.inject('controller:signup/index',   'signup-state', 'service:signup-state');
    // app.inject('controller:signup/method',  'signup-state', 'service:signup-state');
  }
};

以上导致在控制器中调用get('signup-state')时返回空值。

  1. http://discuss.emberjs.com/t/services-a-rumination-on-introducing-a-new-role-into-the-ember-programming-model/4947/10?u=olsen_chris

【问题讨论】:

  • 您是否提前注册了该服务,以便它可以充当依赖注入的工厂?
  • 我正在使用 ember-cli,所以我的印象是为我完成了注册。我的假设错了吗?
  • 那么你的所有玩具都在流血边缘吗? :) 我不确定它有什么魔力,但可能值得手动尝试一下。如果您找到一个说明如何为您旋转该部分的文档,请务必将其发布给我们。
  • 可能不是开始学习 Ember 的最佳方式,但已经做出了决定:)

标签: javascript ember.js


【解决方案1】:

我对使用依赖注入服务的想法很陌生,所以我可能会遗漏一些东西,但是看到 ember 代码库中的这个 example test 让我想知道,你只是错过了一个 app.register('service:signup-state',App.ModelForSignupState) 到给它骨头?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 2019-03-26
    • 1970-01-01
    相关资源
    最近更新 更多