【发布时间】:2013-04-26 10:23:12
【问题描述】:
首先,我是 EmberJS 世界的新手,试图探索和理解这个框架的全部内容,我正在使用 EmberJS 版本1.0.0-rc2。
问题描述
我在一个简单的“身份验证”工作流程中遇到以下情况,我想在调用 transitionTo 时将值从一种状态传递到另一种状态,而值应该从一个视图中获取并传递到另一个视图中。为了澄清我的情况,这里简要描述一下工作流程(@Login 和 @Reset 代表相应的路由/控制器/模型/视图组件):
工作流程:
- @Login:用户尝试使用其凭据(帐户、用户名、密码)登录
- @Login: 用户忘记密码,登录失败
- @Login: 用户决定重设密码并点击链接进入“重设密码”屏幕并显示相应的
- @Reset: 用户已经在上一个屏幕上填写了“用户名”和“密码”的值,因此在此处提供了它们
- 用户只需单击按钮即可获取密码重置链接的邮件。
所以,据我所知,我应该在Route 中处理所有正在改变状态的事情(从“登录”导航到“重置”),诸如登录或重置操作之类的事情应该在Controller。
现在,我想将“帐户”和“密码”的值从 @Login 路由传递到 @Reset 路由。我无法从Route 或Controller 访问View,但我能够从Route 访问Controller,所以我考虑处理reset action Controller 获取两个字段的值并调用 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:
如果我尝试像@MikeGrassotti 建议的那样声明我的两个Controllers 之间的依赖关系
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
如果我只是为ResetController 声明needs 属性并从相应的模板调用controllers.login.account,我没有收到任何错误,但我也没有得到任何值(假设我在帐户字段中输入了“asdf”作为值登录表单)...
【问题讨论】:
标签: ember.js