2012-11-04 70 views
0

对于我的登录/注销情况我烬实施的条件路由:Ember:如何让路由器和控制器一起工作?

App.Router = Ember.Router.extend({ 

    //needs controller handling 
    //goLoggedIn: Ember.Route.transitionTo('loggedIn'), 
    goLoggedOut: Ember.Route.transitionTo('loggedOut'), 

    root: Ember.Route.extend({ 
     index: Ember.Route.extend({ 
     route: '/', 
      enter: function(router) { 
       var logged = getLoginState(); 
       Ember.run.next(function() { 
        if (logged) { 
         router.transitionTo('loggedIn'); 
        } else { 
         router.transitionTo('loggedOut'); 
        } 
       }); 
      } 
     }), 

     loggedIn: Ember.Route.extend({ 
     connectOutlets: function(router, context){ 
      ... 
     } 
     }), 

     loggedOut: Ember.Route.extend({ 
     connectOutlets: function(router, context){ 
      ... 
     } 
     }) 
     ... 

我的index.html说,对的loggedIn视图

<!-- Template for out --> 
    <script type="text/x-handlebars" data-template-name="out"> 
     <hr /><br /> 
     <h1>Logged Out</h1> 
     <span>Login with "test/test"</span><br /><br /> 
     <label>Username: </label>{{view Ember.TextField valueBinding="App.OutController.username"}}<br /> 
     <label>Password: </label>{{view Ember.TextField valueBinding="App.OutController.password" type="password"}}<br /> 

     {{#if App.loginController.isError}} 
     <span class="login-error">Error: Invalid username or password.</span><br /> 
     {{/if}} 

     <br /><button {{action goLoggedIn href=true}}>Login</button> 
    </script> 

现在我委托这个动作只是为了我的路由器。我知道,我可以委托这我的控制器,以及:

action login target="controller" 

但在此之后,该怎么办transitionTo功能在我的路由器?因为我知道这不应该在我的控制器中完成。那么如何将它传递给我的路由器?可能是我错了,我不得不让{{action goLoggedIn href=true}}。然后我的路由器将这个函数委托给我的控制器,并得到响应。我需要像App.LoginController.doLogin和goLoggedIn: Ember.Route.transitionTo('loggedIn')之类的东西。当这种情况下如何实现它?

编辑:

喜欢这个?

App.Router = Ember.Router.extend({ 

    //needs controller handling 
    goLoggedIn: Ember.Route.transitionTo('loggedIn'), 
    goLoggedOut: Ember.Route.transitionTo('loggedOut'), 

    root: Ember.Route.extend({ 
     index: Ember.Route.extend({ 
     route: '/', 
      enter: function(router) { 
       var logged = getLoginState(); 
       Ember.run.next(function() { 
        if (logged) { 
         router.transitionTo('loggedIn'); 
        } else { 
         router.transitionTo('loggedOut'); 
        } 
       }); 
      } 
     }), 

     loggedIn: Ember.Route.extend({ 
     connectOutlets: function(router, context){ 
      ... 
     } 
     }), 

     loggedOut: Ember.Route.extend({ 
     connectOutlets: function(router, context){ 
      ... 
     }, 
     goLoggedIn: function(router, evt) { 
      router.get('inController').tryLogin() 
      router.transitionTo('loggedIn') 
     } 
     }) 
     ... 

我得到:Cannot call method 'split' of undefined

编辑2:

它现在的工作。我不得不删除href=true。谢谢

回答

7

在典型的Ember应用程序中,每个控制器的target属性设置为路由器实例。如果你想发送一个动作到控制器然后到路由器,你可以在控制器的方法内通过说this.get('target').send('goLoggedIn', optionalEvt)

我会建议你让动作直接发送到路由器。您可以让一个函数处理在转换之前可以调用一个或多个控制器上的方法的操作。例如:

... 
{{action log href=true}} 
... 

logIn: function(router, evt) { 
    router.get('userController').prepareForLogin() 
    router.transitionTo('loggedIn') 
} 
+0

嘿如何从控制器转换controllers.send(“loggedIn”)? –

+0

而不是'goLoggedIn:Ember.Route.transitionTo('loggedIn'),'我试过'goLoggedIn:function(router,evt)router.get('inController')。tryLogin() router.transitionTo('loggedIn ') }',但它说:''不能调用未定义的方法'split''' –