0

ログイン/ログアウトのシナリオでは、残り火で条件付きルーティングを実装しました。

 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、各コントローラーのプロパティはルーターインスタンスに設定されます。コントローラーにアクションを送信してからルーターにアクションを送信する場合は、コントローラーメソッド内で次のように言うことで送信できます。this.get('target').send('goLoggedIn', optionalEvt)

アクションをルーターに直接送信することをお勧めします。遷移する前に、1つ以上のコントローラーでメソッドを呼び出すことができるアクションを関数に処理させることができます。例えば:

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

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