为什么Ember view customEvents只传递一个参数?

时间:2014-07-03 12:30:13

标签: ember.js

我正在使用twitter typeahead lib,它可以发送自定义事件。一个这样的事件是“typeahead:selected”,它被记录为将3个参数传递给事件处理程序。

要在Ember中捕获该事件,我首先要这样做:

App = Ember.Application.create({
    customEvents: {
         "typeahead:selected": "onTypeaheadSelected"
    }
})

在视图中,我这样做:

TypeaheadTextField: Ember.TextField.extend({
    onTypeaheadSelected: function(a,b,c) {
        console.log("onTypeaheadSelected", arguments, a, b, c);
    },
})

但是只有第一个参数是由ember设置的,它是jQuery事件对象。参数“b”和“c”未定义。

如果我在我的视图中使用此代码尝试通过jQuery直接监听事件:

didInsertElement: function () {
    this.$().typeahead().on('typeahead:selected', function(a,b,c) {
        console.log("onTypeaheadSelected", arguments, a, b, c);
    });
}

我得到的所有“a”,“b”和“c”都带有值,所以typeahead实际上是在发送它们。

这是ember 1.5.0。

1 个答案:

答案 0 :(得分:1)

事件回调的一般实现是传回SomeCustomEvent arg,其中包含该事件的所有参数。他们围绕这个概念编写了customEvent处理程序(可能是短视的,除非有一些文档说明它是土地的法则)。 https://developer.mozilla.org/en-US/docs/Web/Events

话虽这么说,你需要像你一样在视图层实现它。您可以创建一个mixin或基类(基本上是同一个东西),因此您不需要反复重新创建代码。

App.TypeAheadView = Em.View.extend({
  setupTypeAhead: function () {
    this.$().typeahead().on('typeahead:selected', this.typeAhead);
  }.on('didInsertElement'),
  killTypeAhead: function(){
    this.$().typeahead().off('typeahead:selected', this.typeAhead);
  }.on('willDestroyElement'),
  typeAhead:function(a,b,c) {
    console.log("onTypeaheadSelected", arguments, a, b, c);
  }
});

App.BlahView = App.TypeAheadView.extend();

App.CowView =  App.TypeAheadView.extend();