首先,我是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