Клиентский фильтр YUI Datatable со списком выбора?

Могу ли я фильтровать строки статического набора данных, используя несколько раскрывающихся меню и таблицу данных YUI с разбивкой на страницы?

http://www.mappingbahia.org/project/iguape_dataset.html


person Jason    schedule 20.07.2010    source источник


Ответы (1)


Каждый компонент YAHOO.widget, такой как YUI DataTable использует YUI DataSource компонент, который предоставляет данные, необходимые для заполнения каждого отображаемого компонента YAHOO.widget. Ниже вы можете увидеть, как это работает

Источник данных YUI

Обратите внимание, что каждый компонент YAHOO.widget внутренне обращается к основному источнику данных YUI через sendRequest (см. шаг 1). Теперь давайте посмотрим подпись sendRequest

sendRequest(request, callback)
  • запрос

Для удаленных данных этот запрос может быть строкой параметра/значения, например "id=123&name=foo". Для локальных данных этот запрос может иметь более простое значение, например 123. Указание параметров может быть неуместным, поэтому это значение может быть просто нулевым.

  • Перезвони

Это просто объект JavaScript, который можно описать следующим образом (обратите внимание на каждое свойство)

var callback = {
    success:function(request, response, payload) {
        /*
         * successful request is performed by success property
         */
    },
    failure:function(request, response, payload) {
        /*
         * failure request is performed by failure property
         */
    },
    scope:null,
    argument:null
}

Таким образом, когда каждый компонент YAHOO.widget вызывает внутренний источник данных YUI через метод sendRequest, он передает встроенный объект обратного вызова, как показано выше, который заботится о рендеринге самого компонента YAHOO.widget. Таким образом, если вам нужно настраиваемое поведение, вам нужно сделать вызов базовому источнику данных YUI и передать свой настраиваемый объект обратного вызова, чтобы отфильтровать данные, предоставленные источником данных YUI, следующим образом.

var datatable = // YUI datatable settings goes here

Чтобы прикрепить каждое событие change к каждому выбору, вы можете использовать

YAHOO.util.Event.addListener("sex", "change", function(e) {
    var value = e.getTarget(e).value;

    if(YAHOO.lang.isValue(value)) {
        /**
          * Notice i am retrieving The underlying datasource To make a call To sendRequest method
          */
        datatable.getDataSource().sendRequest(null, {
            success:function(request, response, payload) {
                /**
                  * because scope property (see bellow) refers To The datatable
                  * this keyword can be used To get a reference To The datatable
                  */

                /**
                  * initializeTable method clear any data stored by The datatable
                  */
                this.initializeTable();

                var rs = response.results;
                var filtered = [];
                for(var i = 0; i < rs.length; i++) {
                    /**
                      * Is The sex property equal To The value selected by The user ?
                      */ 
                    if(rs[i]["sex"] == value) {
                        filtered[filtered.length] = rs[i];
                    }
                }

                this.getRecordSet().setRecords(filtered, 0);

                // Update UI
                this.render();
            },
            scope:datatable,
            argument:null
        });
    }
});

Хотя не тестировалось, я уверен, что он будет работать нормально.

person Arthur Ronald    schedule 28.07.2010
comment
Эй, только что нашел это, и это было невероятно полезно и раздражающе отнимало много времени. Большое спасибо, Артур, за то, что вложил работу в этот ответ. Чтобы этот код работал, нужно изменить одну небольшую вещь, то есть необходимо установить свойство totalRecords paginator. Метод initializeTable() обнуляет это свойство, и если оно не будет установлено снова, разбивка на страницы прервется. В строке непосредственно перед this.render укажите следующее: pag = this.get('paginator'); if (pag) {pag.set('totalRecords',filtered.length);} РЕДАКТИРОВАТЬ: просто на заметку, не ныть на вас по поводу трудоемкости, просто на YUI2 - person Chris O'Kelly; 29.10.2012