2013-04-26 97 views
1

首先,我是EmberJS世界的新手,試圖探索和理解這個框架是什麼,我正在使用EmberJS版本1.0.0-rc2EmberJS:從控制器到路由的鏈接方法

問題描述


我有一個簡單的「認證」工作流程,我想通過對呼叫transitionTo從一個狀態到另一個狀態值以下的情況,而值應該從一個視圖得到和也傳遞到另一個。澄清這裏我的情況的工作流的一個簡短說明(@login和@Reset是代表性的爲相應的路由/控制器/模型/視圖組件):

工作流程:

  • @login:用戶嘗試登錄他的憑據(帳戶,用戶名,密碼)
  • @Login:用戶登錄失敗,因爲他忘記了他的密碼
  • @登錄:用戶決定重置他的密碼並點擊鏈接以進入'重置密碼「屏幕與相應的
  • @復位:用戶已經在前一個屏幕上填寫了'用戶名'和'密碼'的值,因此在這裏提供
  • 用戶只需點擊按鈕即可獲取用於密碼重置的郵件鏈接。

所以,正如我的理解,我應該處理這些改變狀態的所有東西Route內(從「登錄」到「復位」導航)的東西,如登錄或復位動作要處理在Controller之內。

現在,我想將@Login Route中的'account'和'password'的值傳遞給@Reset Route。我無法從RouteController訪問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」的值到登錄表單的賬號字段)...

回答

3

am I on the right path by chaining the actions like view --> controller --> route (transitionTo) --> otherRouter --> otherController --> otherView ?

是在條款的過渡,但沒有嘗試傳遞參數。當從一個路徑到另一個需要一個上下文關係中transitionTo('post', somePost)

I want to pass the values for 'account' and 'password' from the @Login Route to the @Reset Route. what is the "Ember Way" of doing this?

而不是傳遞價值的,你應該通過ARGS在transitionTo的唯一情況是,使用綁定來訪問控制器的性能。例如:

App.ResetController = Ember.ObjectController.extend({ 
    needs: ['login'], 
    accountBinding: 'controllers.login.account', 
    usernameBinding: 'controllers.login.username' 
}); 

現在只需使用transitionTo('reset')且沒有參數就可以切換到重置路由。

+0

非常感謝您的回答@MikeGrassotti,但是當我嘗試像這樣看到以下錯誤:'未捕獲的錯誤:斷言失敗:無法將集合('account',(null))委託給'content '對象代理的屬性:其'內容'是未定義的。 – herom 2013-04-29 05:59:09

+0

這裏是我的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

+0

我張貼我的英文更新itial問題有一些更好的代碼示例格式和一個更好的解釋我的問題;) – herom 2013-04-29 08:49:52