将装饰器添加到Select2版本4.x中的数据适配器

时间:2015-06-03 21:24:00

标签: javascript jquery-select2

我想支持我的自定义Select2 Data AdapterMaximumInputLength装饰器。在我的自定义数据适配器中,Utils.Decorate()调用不执行任何操作。

查看this gist,我可以在初始化select2()的同一个地方调用Decorator函数,但这看起来很蹩脚而不是DRY,因为我想初始化许多Select元素。 / p>

为了为MyDataAdapter的所有实例启用最小输入,是否可以从适配器本身装饰该适配器?有更好的方法吗?

我的select2()电话:

$('select').select2({
    dataAdapter: MyDataAdapter,
    minimumInputLength: 2
});

MyDataAdapter(没有依赖关系):

define([...], function(Utils, MinimumInputLength, ArrayAdapter){

    function MyDataAdapter($element, options) {
        this.$element = $element;
        this.options = options;
        MyDataAdapter.__super__.constructor.call(this, $element, options);
    }

    Utils.Extend(MyDataAdapter, ArrayAdapter);
    Utils.Decorate(MyDataAdapter, MinimumInputLength); <-- does nothing

    MyDataAdapter.prototype.query = function(params, callback) {
        console.log('query!');
    };

    return MyDataAdapter;

});

1 个答案:

答案 0 :(得分:8)

你会在the gist注意到他们对装饰他们的适配器的呼吁看起来像

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated) 

       if let navigationController = navigationController {
       previousStatusBarHiddenState = navigationController.navigationBar.hidden
       navigationController.setNavigationBarHidden(true, animated: animated)
  }
}
override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)

       // restore status bar
       navigationController?.setNavigationBarHidden(previousStatusBarHiddenState, animated: animated)
}

他们稍后在初始化Select2时继续使用var dropdownAdapter = Utils.Decorate( Utils.Decorate( DropdownAdapter, DropdownSearch ), AttachContainer ); 。这是因为dropdownAdapter 返回装饰的类而不是就地装饰它。您还会注意到它之后装饰器和适配器已经创建了。

因此,不应在适配器中间调用Utils.Decorate,而应在结束时调用它。当您返回完成的适配器时,或者在您返回之前。

Utils.Decorate

在您遇到重大问题之前,您没有使用define([...], function(Utils, MinimumInputLength, ArrayAdapter){ function MyDataAdapter($element, options) { this.$element = $element; this.options = options; MyDataAdapter.__super__.constructor.call(this, $element, options); } // Always extend after making the constructor Utils.Extend(MyDataAdapter, ArrayAdapter); MyDataAdapter.prototype.query = function(params, callback) { console.log('query!'); }; // Decorate after the adapter is built return Utils.Decorate(MyDataAdapter, MinimumInputLength); }); 中返回的课程。但是你遇到的另一个问题是它不会起作用,这是因为你在装饰后覆盖了Utils.Decorate方法。