Объекты DataTable обработчик поиск фильтр


Я пишу на JavaScript функцию, где мне нужно позвонить в сторонней библиотеке (предварительно 1.10 объекты DataTable) в зависимости от того, является ли пользователь предоставляет целое число в качестве входных данных для функции во время инициализации. Я вставить сюда фрагмент. Как вы можете видеть он имеет повторяющийся код в если/другое положения, единственным отличием является способ подписи *.fnFilter.

Как я могу оптимизировать этот код? Также я не хочу, чтобы проверить состояние во время каждого нажатия клавиши.

/*
 * By default this is a global search box events. Global being searchable across all columns.
 * But if an int is provided as an input then it will apply the search only on that column.
 * */
_bindSearchEvents: function(onColumnIndex) {

    var self = this;

    if (Math.ceil(onColumnIndex) === Math.floor(onColumnIndex)) {
        self.settings.search.input.live('keyup', function() {
            self.widget.fnFilter($(this).val(), onColumnIndex);
        });

        self.settings.search.reset.live('click', function() {
            self.settings.search.input.val("");
            self.widget.fnFilter("", onColumnIndex);
        });

    } else {

        self.settings.search.input.live('keyup', function() {
            self.widget.fnFilter($(this).val());
        });

        self.settings.search.reset.live('click', function() {
            self.settings.search.input.val("");
            self.widget.fnFilter("");
        });
    }
},


1218
1
задан 14 сентября 2011 в 02:09 Источник Поделиться
Комментарии
2 ответа

На основе http://legacy.datatables.net/api определение, значение по умолчанию целочисленное значение .fnfilter(инт) имеет значение null. Рекомендуется установить его в null, чтобы не позволить им быть неопределены.

/*
* By default this is a global search box events. Global being searchable across all columns.
* But if an int is provided as an input then it will apply the search only on that column.
* */
_bindSearchEvents: function (onColumnIndex) {

var index = null; // defaults to undefined
if (Math.ceil(onColumnIndex) === Math.floor(onColumnIndex)) {
index = onColumnIndex;
}

var searchInput = this.setting.search.input;
var searchReset = this.setting.search.reset;
var fnFilter = this.setting.widget.fnFilter;
searchInput.live('keyup', function () {
fnFilter($(this).val(), index);
});

searchReset.live('click', function () {
searchInput.val("");
fnFilter("", index);
});
},

Я использую searchInput, searchReset, fnfilter, чтобы избежать повторного вызова 'многослойный функции, такие как этот.установка.поиск. Это дает два преимущества:
я) более эффективно в входные доступа, сброса и fnFilter. Это может быть огромным плюсом, если _bindSearchEvents осуществляется несколько раз.
II) обеспечить более читабельный код. Это может быть мой личный вкус.

2
ответ дан 14 сентября 2011 в 05:09 Источник Поделиться

Поскольку все, что есть различия между двумя, если органы/еще аргументы метода fnFilter, можно создать разницу в один if, а затем использовать это в одну копию кода, а не два.

/*
* By default this is a global search box events. Global being searchable across all columns.
* But if an int is provided as an input then it will apply the search only on that column.
* */
_bindSearchEvents: function (onColumnIndex) {

var self = this;
var args = [];
if (Math.ceil(onColumnIndex) === Math.floor(onColumnIndex)) {
args.push(onColumnIndex);
}
self.settings.search.input.live('keyup', function () {
var argsCopy = [].concat(args); // make copy of args
argsCopy.unshift($(this).val()); // push item onto front of args
self.widget.fnFilter.apply(self.widget, argsCopy);
});

self.settings.search.reset.live('click', function () {
self.settings.search.input.val("");
var argsCopy = [].concat(args);
argsCopy.unshift(""); // push item onto front of args
self.widget.fnFilter.apply(self.widget, argsCopy);
});
},

Если fnFilter функции написано, чтобы проверить, если второй параметр имеет значение null (вместо того, чтобы проверить количество переданных аргументов), то это укороченная версия может работать также, но мы должны увидеть, что fnFilter документации написано или как fnFilter исходный код на самом деле работает, чтобы знать, если это более короткий способ будет работать:

/*
* By default this is a global search box events. Global being searchable across all columns.
* But if an int is provided as an input then it will apply the search only on that column.
* */
_bindSearchEvents: function (onColumnIndex) {

var self = this;
var index = null;
if (Math.ceil(onColumnIndex) === Math.floor(onColumnIndex)) {
index = onColumnIndex;
}
self.settings.search.input.live('keyup', function () {
self.widget.fnFilter($(this).val(), index);
});

self.settings.search.reset.live('click', function () {
self.settings.search.input.val("");
self.widget.fnFilter("", index);
});
},

3
ответ дан 14 сентября 2011 в 03:09 Источник Поделиться