指定模板中的视图操作?

时间:2012-07-16 13:28:06

标签: ember.js

我想知道是否可以为视图分配操作,就像我可以为HTML标记分配操作一样:

这有效:

<button {{action "show2" }}>Test 1</button>

这不是:

{{#view NewApp.MenuButton }}
   {{action "show3" target="controller"}}
{{/view}}

我知道我可以在视图中实现click功能。但我想将按钮用作某种可重用的组件。

1 个答案:

答案 0 :(得分:4)

您通常希望在HTML元素上使用句柄action helper,而不是在Ember.View上。

由于您要将事件附加到NewApp.MenuButton查看您,请在视图类定义中定义事件。例如,我们处理click事件:

NewApp.MenuButton = Ember.View.extend({

  click: function(event){
    // When the user clicks this view, 
    // this function will be called.

    // ... handle the click
    App.myController.menuButtonWasClicked();
  }
});

如果您要附加的事件不是内置事件之一,则可以注册自己的事件。查找内置支持的事件以及如何在此处注册自定义事件:Ember.js - Events


修改:您说您希望能够重复使用它。您可以定义一个mixin来附加任意事件并定位任意对象:

Ember.MyEventAttacher = Ember.Mixin.create({
   init: function() {
     var action = this.get('action');
         target = this.get('target'),
         targetObj = Ember.getPath(target);

     if (action && targetObj) {
        var targetEventFnc = targetObj[action];

        if (typeof targetEventFnc === 'function') {
           var actionFnc = function(event) {
              targetEventFnc(event);
           }

           this.set(action, actionFnc);
     }

     this._super();
   }
});

在视图中包含Mixin:

NewApp.MenuButton = Ember.View.extend(Ember.MyEventAttacher);

然后在模板中重复使用此视图,确保定义actiontarget属性。例如:

{{#view NewApp.MenuButton action="show3" target="NewApp.myController"}}
   <!--  ...  -->
{{/view}}

定位

NewApp.myController = Ember.Controller.create({
   show3: function(event) {
      // the event is sent here!
   }
});