1

私の質問のサンプルコードはこちらです。デフォルトで TextField を含む SearchView を表示するシンプルな Ember アプリです。

ユーザーがテキストを入力して Enter キーを押すと、テキスト ボックスに入力された値を渡して別の状態 (displayUserProfile) に遷移したいと考えています。

最初に、Textbox のinsertNewlineコールバックで、アプリケーションのルーターのtransitionToメソッドを呼び出し、値をパラメーター オブジェクトの一部として渡します。

App.SearchTextFieldView = Em.TextField.extend({
  insertNewline: function() {
    App.router.transitionTo('displayUserProfile', {
      username: this.get('value')
    });
  }
});

それはうまくいきますが、無限スクロールに関する質問に対するパングラッツの答えは、別のアプローチを使用していることに気付きました。代わりに、ビューのコントローラーでメソッドを呼び出し、コントローラーのターゲット (ルーター) でメソッドを呼び出します。

これにより、コードが次のように変更されます。

App.SearchTextFieldView = Em.TextField.extend({
  insertNewline: function() {
    Em.tryInvoke(this.get('controller'), 'displayUserProfile', this.get('value').w());
  }
});

App.SearchController = Em.Object.extend({
  displayUserProfile: function(username) {
    this.get('target').transitionTo('displayUserProfile', {
      username: username
    });
  }
});

私の質問は次のとおりです。どちらのアプローチが優れていますか? ビューから直接transitionToを呼び出すか、ビューのコントローラーに委譲しますか?

4

2 に答える 2

3

別のアプローチをお勧めします。insertNewLineルーターによって処理されるアクションをトリガーする必要があります。これにより、状態が遷移します。

App.SearchTextFieldView = Em.TextField.extend({
  insertNewline: function() {
    this.get('controller.target').send('showUser', {username: this.get('value')});
  }
});

App.Router = Ember.Router.extend({
  ...
  foo: Ember.Router.extend({
    showUser: function(router, evt) {
      router.transitionTo('displayUserProfile', evt);
    });
  }
});

アプリで有効な最上位のルートに showUser ハンドラを配置する必要があります。

このアプローチは、ビューが DOM レベルのイベントを処理し、必要に応じてそれらをルーターによって処理されるセマンティック アクションに変換する Ember アプリのイベントの一般的なパターンに従います。

于 2012-08-31T02:21:45.877 に答える
2

個人的には、2 番目のアプローチの方が優れていると思います。まず、ルーターに静的にアクセスするのはよくないということです。次に、私にとっては、ビューをロジックレスに保つ必要があるため、コントローラーへの委任は良い選択のようです。
あなたの場合、これはルーターへの呼び出しにすぎませんが、テキストフィールド値でいくつかのアルゴリズムを処理することを想像できます。ビューでこの処理を行うと、ビューに UI コードとロジック コードが混在することになります。ビューは UI コードのみを処理する必要があります。

于 2012-08-30T07:11:25.457 に答える