首先,我是EmberJS世界的新手,试图探索和理解这个框架是什么,我正在使用EmberJS版本1.0.0-rc2
。EmberJS:从控制器到路由的链接方法
问题描述
我有一个简单的“认证”工作流程,我想通过对呼叫transitionTo
从一个状态到另一个状态值以下的情况,而值应该从一个视图得到和也传递到另一个。澄清这里我的情况的工作流的一个简短说明(@login和@Reset是代表性的为相应的路由/控制器/模型/视图组件):
工作流程:
- @login:用户尝试登录他的凭据(帐户,用户名,密码)
- @Login:用户登录失败,因为他忘记了他的密码
- @登录:用户决定重置他的密码并点击链接以进入'重置密码“屏幕与相应的
- @复位:用户已经在前一个屏幕上填写了'用户名'和'密码'的值,因此在这里提供
- 用户只需点击按钮即可获取用于密码重置的邮件链接。
所以,正如我的理解,我应该处理这些改变状态的所有东西Route
内(从“登录”到“复位”导航)的东西,如登录或复位动作要处理在Controller
之内。
现在,我想将@Login Route中的'account'和'password'的值传递给@Reset Route。我无法从Route
或Controller
访问View
,但是我可以从Route
访问Controller
,因此我考虑处理Controller
中的reset action
以获取这两个字段的值并调用方法在Route
然后将执行transitionTo
方法。这是实现这种行为的正确方法吗?
我给一个小的代码示例,也许这将有助于看到事情更清晰:
代码
的LoginController:
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:
LoginRoute = Ember.Route.extend({
renderTemplate: function() {
this.render('authentication-login',
{
outlet: 'main'
});
},
events: {
reset: function (args) {
this.transitionTo('authentication.reset', args); // <-- does it work?
}
}
});
Qu estion
我在正确的道路上通过链接的动作像view --> controller --> route (transitionTo) --> otherRouter --> otherController --> otherView
?这样做的“Ember方式”是什么?
更新1:
,如果我试图声明我的两个Controller
S之间的依赖关系就像@MikeGrassotti建议
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
财产和相应的模板,我没有得到任何错误调用controllers.login.account
,但我也拿不出值(假设我输入“ASDF”的值到登录表单的账号字段)...
非常感谢您的回答@MikeGrassotti,但是当我尝试像这样看到以下错误:'未捕获的错误:断言失败:无法将集合('account',(null))委托给'content '对象代理的属性:其'内容'是未定义的。 –
herom
2013-04-29 05:59:09
这里是我的ResetController代码片段(我希望它在某种通信中可读):App.ResetController = Ember.ObjectController.extend({'login'], accountBinding:'controllers.login。帐户', usernameBinding:'controllers.login.username', requestResetMail:function(){ alert('为用户请求邮件'+ this.get('usernameBinding')+'@'+ this.get(' accountBinding '));} , 取消:函数(){ this.set(' accountBinding”,NULL); this.set( 'usernameBinding',NULL); } });' – herom 2013-04-29 06:00:19
我张贴我的英文更新itial问题有一些更好的代码示例格式和一个更好的解释我的问题;) – herom 2013-04-29 08:49:52