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