7

テーブルの行をクリックして切り替えられるようにしたい、展開/折りたたみ可能なコンテンツを含むビューがあります。1.0より前は、テンプレートにこれがありました:

<tr {{action "expand"}}>

これは以前に私の見解で処理されました:

App.ContentRowView = Em.View.extend({
   templateName: 'ember/templates/content/row',
   expand: function() {
      this.set('isExpanded', !this.get('isExpanded'));
   },
   isExpanded: false
});

ただし、pre1.0 にアップグレードした後、アクションはルーターによって直接実行されるようになりました。これは多くの状況で理にかなっていますが、この場合、展開は実際にはビューの問題です。これをクリックイベントハンドラーに置き換えてみましたが、運が悪かったです。

pre1.0 でこのようなビュー関連イベントを処理する方法に関するベスト プラクティスはありますか?

4

3 に答える 3

20

非推奨の回答


@outside2344 の答えがうまくいったとしても、それは正確ではないと思います。IndeedparentViewはビューを表すのではなく、parentView の parentView を表します。1.0-pre 以降、ビューはそのコンテキストを保持するため、テンプレートでthisは、parentView をparentView表しparentView.parentView、 をview表し、現在のビューを表します。これを説明するフィドルを次に示します: http://jsfiddle.net/Sly7/cnmJa/

私にとっての答えは{{action expand target="view"}}

編集(@Gal Ben-Haimへの回答)

ルーターベースのアプリケーションでは、アクション ヘルパーの動作はほとんど変わりません。ドキュメントからの引用:

ルーター駆動のアプリケーションでは、アクションがビューによってインターセプトされない場合、そのイベントはそのビューがレンダリングされたルートにバブルアップします。そのルートが別のルートのサブルートである場合、最上位のルート定義である über-container: root まで遷移が検索されます。

このバブリング効果により、特定のアクションを非公開にすることができます。特定の遷移を特定のサブサブ状態でのみ使用できるようにする必要がある場合は、遷移をサブ状態に配置すると、一種のスコープが達成されます。

基本的に、ルーター駆動型のアプリでは、アクション ヘルパーでターゲットを明示的に定義しないと、ルーターに送信されます。


更新された回答

ガイドはこの質問に非常によく答えていると思います。http://emberjs.com/guides/templates/actions/#toc_specifying-a-targetを参照してください

于 2012-08-09T18:45:04.053 に答える
1

pre1.0では、アクションにtarget = "parentView"を追加することで、ビューフィールドをアクションにすることができます。

{{action "expand" target="parentView"}}
于 2012-08-09T16:30:54.397 に答える
1

デフォルトでは、イベントはビュー階層を通過しません。これを変更できます (ただし、推奨するとは言えません)。

(function() {
    Ember.View.reopen({
        // Let actions bubble to parentView by default.
        target: function() {
            return this.get('parentView');
        }.property('parentView')
    });
})();
于 2013-09-23T14:57:11.667 に答える