Ember的*需要*依赖

时间:2014-07-21 20:27:20

标签: javascript ember.js

我有一个注册过程,其中包含几个步骤,并希望将状态存储在服务中,每个控制器都可以访问每个步骤。

我能够让这个工作,但在某种程度上似乎并没有与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

1 个答案:

答案 0 :(得分:0)

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