error sort column

Здравствуйте! При сортировке столбцов в DataTable понадобилось создать отдельную функцию сортировки, для обеспечения сортировки по дробному числу, с разделителем - запятой. Для неё в текущей реализации Webix требуется 3 параметра - строка1, строка2, столбец сортировки. Однако передаётся только два параметра - две строки. В результате нельзя сделать универсальную сортировку по одному методу для разных столбцов, а приходится делать идентичные процедуры для каждого столбца, что очень нехорошо.

Вот непосредственный код вызова сортировки в вашей библиотеке:

        if (typeof type == "function")
            this.data.sort(type, direction);
        else
            this.data.sort(col_id, direction, type || "string");

Предлагаю вот такое изменение которое не повлияет на текущую работу старого кода:

        if (typeof type == "function")
            this.data.sort(type, direction,col_id); // добавлен параметр, который может не использоваться.
        else
            this.data.sort(col_id, direction, type || "string");

Весь новый код функции:

_sort:function(col_id, direction, type){
    direction = direction || "asc";
    this.markSorting(col_id, direction);

    if (type == "server"){
        this.loadNext(-1, 0, {
            "before":function(){
                var url = this.data.url;
                this.clearAll();
                this.data.url = url;
            }
        }, 0, 1);
    } else {
        if (type == "text"){
            this.data.each(function(obj){ obj.$text = this.getText(obj.id, col_id); }, this);
            type="string"; col_id = "$text";
        }

        if (typeof type == "function")
            this.data.sort(type, direction,col_id); // добавлен параметр, который может не использоваться.
        else
            this.data.sort(col_id, direction, type || "string");
    }
},

Здравствуйте,

К сожалению, то, что Вы предалагаете, не будет работать. Вы можете использовать замыкание, как например вот тут:

http://webix.com/snippet/7547cfd5

Здравствуйте.
Почему не будет работать? Параметр передаётся, просто вы его зачем-то отсеяли, хотя он вполне себе востребован и используется в соседних вызовах.
Зачем нужно усложнение там, где без этого можно обойтись?
Или есть какие-то ускользающие от моего внимания факторы?

Здравствуйте,

Посмотрите, пожалуйста, документацию для sort() метода - если первый параметр функция, то возможны только 2 параметра:

http://docs.webix.com/api__link__ui.proto_sort.html

если же добавить 3й и использовать пар-ры в нужном порядке, то теряется возможность сортировать с учетом различных полей.

Вы показываете документацию на вызов метода sort, заголовок которого я не предлагал менять.

я веду разговор про находящуюся в этой документации часть:

function sort_by_length(data1, data2){
    return data1.length>data2.length ? 1:-1;
}
 
data.sort("#name#","asc",sort_by_length);

где как раз

sort_by_length(data1, data2){

заменить на

sort_by_length(data1, data2, "#name#"){

Возможность сортировать с учётом различных полей не теряется, а появляется возможность добавления ещё одной универсальной сортировки относительно текущего поля. И не приведёт к поломке существующего кода или изменению каких-то старых обработчиков.
Однако это позволит облегчить создание собственных процедур сортировки для менее опытных пользователей.
И плюс ко всему предложенный вами способ замыканий тоже будет прекрасно работать для более продвинутых пользователей.

День добрый

Сценарий, который вы описываете, понятен и логичен. Но менять код таким образом мы не будем, так как это разрушает текущую абстрацию работы с данными.

Мы можем добавить возможность задавать свой тип сортировки. Например как

webix.DataStore.sort.as.length = function(a, b){ return a.length > b.length; }

который потом можно будет использовать в конфигурации грида

{ id:"title", width:200, sort:"length" }

Такой код не будет работать в текущей версии - sort.as это приватные свойства

Максим, я понял, спасибо.
Однако предложенный Вами способ тоже не универсален ибо требует жёсткого указания поля для сортировки внутри процедуры. В результате нет возможности сделать универсальную процедуру сортировки независимую от структуры данных.
В нашем случае потребовалось сделать числовую сортировку для столбца с дробными данными с разделителем - запятой. Соответственно в итоге пришлось менять разделитель в исходном запросе.

В принципе метод предложенный Марией полностью покрывает все необходимые потребности, просто мне показалось недоработкой именно тот момент, в котором в процедуру сортировки могут передаваться все параметры, требуемые для полноценного построения универсальной процедуры, но не передаются.
Я решил что это простая недоработка. Раз вы считаете что это правильно - не буду спорить. Просто усложнение всегда казалось мне неправильным путём. Именно оно убило многие замечательные инструменты.

Вами способ тоже не универсален ибо требует жёсткого указания поля для сортировки внутри процедуры.

Не совсем, в вышеприведенном примере в функцию as.length придут параметры заданные в column.id - то есть obj.title от двух разных строк. То есть то какой параметр попадет в функцию сравнения задается айдишкой столбца, а функция сравнения только сравнивает эти две строки

сделать числовую сортировку для столбца с дробными данными с разделителем - запятой

webix.DataStore.sort.as.customInt= function(a, b){ 
   return parseFloat( a.replace(",",".") ) > parseFloat( b.replace(",",".") )
}

Как видите, функция не зависит от именования данных, достаточно в конфиге столбца прописать sort:“customInt” ( опять таки - этот функционал в данный момент не доступен )

в котором в процедуру сортировки могут передаваться все параметры, требуемые для полноценного построения универсальной процедуры, но не передаются

функция сортировки задумана как просто функция сравнения двух значений, это позволяет использовать ее во многих местах в библиотеке а не только в datatable

Ясно. Спасибо. Будем пользоваться.