我想支持我的自定义Select2 Data Adapter的MaximumInputLength
装饰器。在我的自定义数据适配器中,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;
});
答案 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
方法。