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 表示已登录视图

    <!-- 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}}。然后我的路由器将这个功能委托给我的控制器,我得到一个响应。而不是让goLoggedIn: Ember.Route.transitionTo('loggedIn')我需要像 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. 谢谢

4

1 回答 1

7

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

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

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

logIn: function(router, evt) {
  router.get('userController').prepareForLogin()
  router.transitionTo('loggedIn')
}
于 2012-11-04T17:30:08.853 回答