首先,我是EmberJS世界的新手,试图探索和理解这个框架是什么,我正在使用EmberJS版本1.0.0-rc2
。
我在一个简单的'身份验证'工作流程中遇到以下情况:我希望在调用transitionTo
时将值从一个状态传递到另一个状态,而值应从一个视图中获取并传递到另一个视图中。在这里澄清我的情况工作流程的简短描述(@Login和@Reset代表相应的路由/控制器/模型/视图组件):
工作流:
所以,正如我所理解的那样,我应该处理Route
内所有正在改变状态(从'login'导航到'reset')的事情,例如登录或重置动作应该是在Controller
内处理。
现在,我想将'account'和'password'的值从@Login Route传递给@Reset Route。我无法从View
或Route
访问Controller
,但我可以从Controller
访问Route
,所以我考虑过处理reset action
中的Controller
以获取两个字段的值,然后在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?
}
}
});
我是通过链接像view --> controller --> route (transitionTo) --> otherRouter --> otherController --> otherView
这样的行为走在正确的道路上吗?这样做的“Ember Way”是什么?
如果我尝试声明我的两个Controller
之间的依赖关系,如@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
的{{1}}属性并从相应的模板中调用ResetController
,我就不会收到任何错误,但我也没有得到任何价值(因为我输入'asdf'作为登录表单的帐户字段中的值)...
答案 0 :(得分:3)
我是通过链接像view这样的动作走向正确的道路 - &gt;控制器 - &gt; route(transitionTo) - &gt; otherRouter - &gt; otherController - &gt; otherView?
在转换方面是肯定的,但在尝试传递参数方面没有。您应该在transitionTo
中传递参数的唯一时间是需要上下文时transitionTo('post', somePost)
我想将'account'和'password'的值从@Login Route传递给@Reset Route。这样做的“Ember Way”是什么?
不是将值从一个路由传递到另一个路由,而是使用绑定来访问控制器的属性。例如:
App.ResetController = Ember.ObjectController.extend({
needs: ['login'],
accountBinding: 'controllers.login.account',
usernameBinding: 'controllers.login.username'
});
现在只需使用transitionTo('reset')而不使用args切换到重置路径。