2012-08-04 48 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