2012-08-04 19 views
1

我在Ember中構建了一個登錄表單。Emberjs在視圖中重定向

App.Router = Ember.Router.extend( // states here);

然後,我有以下看法使用{{行動「submitLogin」}}

App.SignInView = Ember.View.extend 
templateName: 'signin' 

submitLogin: (event) -> 
    login = @getPath('email.value') 
    password = @getPath('password.value') 
    console.log "Login: " + login + " Password: " + password 
    // how do I redirect to a different state? I.e. "loggedIn" 

submitLogin從模板觸發當你從這個片段看到,我想檢查用戶名/密碼,然後顯示Web應用程序的「私人」區域。這裏最好的做法是什麼?

回答

3

你應該實現你的submitLogin投手當前路線內,和過渡路線從處理程序,成爲類似:

submitLogin: (router, event) -> 
    login = event.context.email // e.g 
    password = event.context.password // e.g 

    // do ajax call here... 
    // and from reply handlers: 
    router.transitionTo('loggedIn'); 

你將不得不通過電子郵件&密碼箱在動作助手,如:{{action submitLogin this}}

+0

所以基本上這意味着所有事件,之後我改變應用程序的狀態應傳遞給路由。本來我期待這個由控制器處理。 – 2012-08-05 08:14:31

+0

事實上,我的理解是事件處理大部分被包含在視圖(而不是控制器)中,甚至我的印象是擴展Ember.View的目的是處理事件。任何人都可以推薦任何「最佳做法」類型的規則? – dechov 2012-08-05 11:26:08

+0

@AndreiVaranovich控制器旨在代理數據,幷包含增值的原語,但路由器狀態應始終從其自身內部進行修改。 – 2012-08-05 13:49:48

1

這個討論Ember.js get view triggering event in the router使我對下面的設計:

  1. 讓視圖處理事件
  2. 使用smth將事件轉發到路由器。這樣的觀點裏面

    App.router.send('signUp',context) 
    

這裏的關鍵是,我不需要更改路由器的外部路由器的狀態,而是發送上下文由當前處理路由器的狀態。

+1

您可以使用'this.get('控制器,而不是引用絕對路徑。目標')'這裏是這個視圖。 – 2012-08-10 16:37:13