首先,我是 EmberJS 世界的新手,试图探索和理解这个框架的全部内容,我正在使用 EmberJS 版本1.0.0-rc2
。
问题描述
我在一个简单的“身份验证”工作流程中遇到以下情况,我想在调用时将值从一种状态传递到另一种状态transitionTo
,而这些值应该从一个视图中获取并传递到另一个视图中。为了澄清我的情况,这里简要描述了工作流程(@Login 和 @Reset 代表相应的路由/控制器/模型/视图组件):
工作流程:
- @Login:用户尝试使用他的凭据(帐户、用户名、密码)登录
- @Login:用户因为忘记密码而无法登录
- @Login:用户决定重置他的密码并单击链接以进入“重置密码”屏幕,并显示相应的
- @Reset:用户已经在上一个屏幕上填写了“用户名”和“密码”的值,因此在此处提供它们
- 用户只需单击按钮即可获取密码重置链接的邮件。
所以,据我了解,我应该处理所有Route
在Controller
.
现在,我想将“帐户”和“密码”的值从 @Login 路由传递到 @Reset 路由。我无法访问View
fromRoute
或 from Controller
,但我能够访问Controller
from the Route
,所以我考虑处理reset action
inController
以获取两个字段的值并调用Route
然后将执行的方法transitionTo
方法。这是实现这种行为的正确方法吗?
我将给出一个小代码示例,也许它有助于更清楚地看到事情:
代码
登录控制器:
App.LoginController = Ember.ObjectController.extend({
account: null,
username: null,
password: null,
submitLogin: function () {
$.ajax({
type: 'POST',
url: 'authentication/login',
data: {
account: this.get(account),
username: this.get(username),
password: this.get(password)
},
success: function (data, status) {
var dStat = data.status.toString().toLowerCase();
if (dStat == 'ok') {
window.location.assign(data.data.redirect);
} else if (dStat == 'warning') {
console.warn(dStat + data.message);
} else if (dStat == 'error') {
console.error(dStat + data.message);
}
},
error: function (xhr, ajaxOptions, thrownError) {
console.error('Got an ERROR on Ajax Request!');
console.error('Status (' + xhr.status + ') - Error: ' + thrownError);
}
});
},
requestReset: function() {
this.get('target').send('reset', { account: this.get('account'), username: this.get(username)}); // <-- this is NOT working
}
});
登录路径:
LoginRoute = Ember.Route.extend({
renderTemplate: function () {
this.render('authentication-login',
{
outlet: 'main'
});
},
events: {
reset: function (args) {
this.transitionTo('authentication.reset', args); // <-- does it work?
}
}
});
问题
通过链接类似的动作,我是否走在正确的道路上view --> controller --> route (transitionTo) --> otherRouter --> otherController --> otherView
?这样做的“Ember Way”是什么?
更新 1:
如果我尝试Controller
像@MikeGrassotti 建议的那样声明我的两个 s之间的依赖关系
App.LoginRoute = Ember.Route.extend({
renderTemplate: function() {
this.render('login', { outlet: 'main' });
},
events: {
reset: function() {
this.transitionTo('reset');
}
}
});
App.LoginController = Ember.ObjectController.extend({
account: null,
username: null,
password: null,
login: function() {
}
});
App.ResetRoute = Ember.Route.extend({
renderTemplate: function() {
this.render('reset', { outlet: 'main' });
}
});
App.ResetController = Ember.ObjectController.extend({
needs: ['login'],
accountBinding: 'controllers.login.account',
usernameBinding: 'controllers.login.username'
});
我收到以下错误消息:
Uncaught Error: assertion failed: Cannot delegate set('account', (null)) to the 'content' property of object proxy <App.ResetController:ember198>: its 'content' is undefined
如果我只是从相应的模板声明和调用的needs
属性,我没有收到任何错误,但我也没有得到任何值(假设我在登录表单的帐户字段中输入了“asdf”作为值)......ResetController
controllers.login.account