我有一个注册过程,其中包含几个步骤,并希望将状态存储在服务中,每个控制器都可以访问每个步骤。
我能够让这个工作,但在某种程度上似乎并没有与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')
时返回的空值。
答案 0 :(得分:0)
我对使用依赖注入服务的想法很新,所以我可能会遗漏一些东西,但是在ember代码库中查看这个example test让我很奇怪,你是不是错过了一个app.register('service:signup-state',App.ModelForSignupState)
给它骨头?