3

次のコードでは、クリックイベントが委任され、ビュー階層内の3つの「クリック」ハンドラーがすべて起動されます。

ただし、ビュー階層全体で「編集」を実行したいとも思います。「編集」は、単に「子」ビューの要素のターゲットです。

レンプレート

<script type="text/x-handlebars">
  {{#view App.GrandparentView}}
    {{#view App.ParentView}}
        {{#view App.ChildView}}
           <span {{action "edit" target="view"}}>Click Me</span>
        {{/view}}    
    {{/view}}
  {{/view}}
</script>

JavaScript

App.GrandparentView = Ember.View.extend({
  click: function() {
    console.log('Grandparent Click Fired!');
  },
  edit: function () {
   console.log('GrandParent edit fired');        
  }
});
App.ParentView = Ember.View.extend({
  click: function() {
    console.log('Parent Click Fired!');
  },
  edit: function () {
    console.log('Parent edit fired');        
  }

});
App.ChildView = Ember.View.extend({
  click: function() {
    console.log('Child Click Fired!');
  },
  edit: function () {
    console.log('Child edit fired');        
  }

});​

ビュー階層でターゲットハンドラーを委任する方法はありませんか?私がたくないことはこれです:

App.ChildView = Ember.View.extend({
  click: function() {
    console.log('Child Click Fired!');
  },
  edit: function () {
    console.log('Child edit fired');        
    this.get('parentView').edit(); //DO NOT WANT TO DO THIS.
  }
});​

テストする例として、jsFiddleを次に示します。

4

1 に答える 1

2

約1週間前に投稿したのと同じ質問のようです。私が見る限り、そのような機能はemberには実装されていません。イベントはビュー階層に伝播されますが、アクション名が失われ、デフォルトのclickハンドラーがトリガーされます。

私が見つけた唯一の回避策は、Ember.Viewクラス自体を再度開き、次のようにクリックハンドラーをオーバーライドすることです。

Ember.View.reopen({
  click: function(event){
    if(event.view !== this && this[event.actionName]){
        return this[event.actionName](event);
    }
  }
})

ここでフィドルを参照してください:

http://jsfiddle.net/Sly7/zZyCS/

于 2012-10-23T15:32:00.133 に答える