Как изменить источник данных в сетке данных YUI после создания

Я использую Yahoo DataTable, для которого используется API здесь.

У меня возникают трудности с изменением данных после того, как я отрисовал сетку один раз. Я использую jQuery для получения данных через AJAX или с острова данных на стороне клиента, и мне нужно вернуть это в сетку.

В API DataTable нет метода setDataSource, и изменение 'dataSource.liveData' не обновляет сетку.

 // does not work
 dataTable.dataSource.liveData = [ {name:"cat"}, {name:"dog"}, {name:"mouse"};

Пример, на котором основан мой код, — это базовый пример LocalDataSource.

Как я могу обновить источник данных без полного воссоздания таблицы. Я НЕ хочу использовать источники данных YUI, которые выполняют асинхронные вызовы. Мне нужно знать, как я могу сделать это "вручную".


person Simon_Weaver    schedule 23.06.2009    source источник
comment
Саймон, проверяю это. это получилось?   -  person Keith Bentrup    schedule 06.07.2009
comment
@keith мой босс всегда меняет приоритеты в отношении меня. я еще не успел попробовать. дам вам знать   -  person Simon_Weaver    schedule 06.07.2009


Ответы (4)


Вы были на правильном пути, вы просто забыли указать источнику данных отправить данные в таблицу данных. Предполагая, что вы используете LocalDataSource и хотите заменить данные в таблице тем, что находится в источнике данных, после замены livedata вы просто делаете

dataTable.getDataSource().sendRequest(null,
  {success: dataTable.onDataReturnInitializeTable},
  dataTable);

Также см. другие onDataReturnXXX методы DataTableв справочнике по API. Вы можете добавить новые данные вместо замены и т. д.

person Community    schedule 01.08.2009
comment
Спасибо. Это работает, но если я настроил разбивку на страницы, раздел разбивки на страницы исчезнет после обновления. Ребята, вы пробовали запустить приведенный выше фрагмент кода в таблице данных с нумерацией страниц? Еще раз спасибо! - person Abe; 22.01.2010

Я просто хотел добавить, что вы можете сохранить нумерацию страниц, если передадите вызов getState() в свойстве аргумента.

dataTable.getDataSource().sendRequest(null,
    {
        success: dataTable.onDataReturnInitializeTable,
        argument: dataTable.getState()       
    }
);
person Abe    schedule 08.03.2010

Как обновить источник данных без полного воссоздания таблицы?

Вы имеете в виду без использования «нового» утверждения? Если да, то мне не приходилось делать это самому, но я часто использую YUI. Я заметил, что есть метод deleteRows, который вы можете использовать для удаления всех строк, 0 по длине таблицы, а затем использовать addRows, который принимает литеральный массив, такой как ваш, и индекс, 0, в этом случае.

Вы пробовали это?

Изменить: взгляните на этот пример. То, что вы хотите сделать, определенно может быть сделано. Таблица обновляется локально с заданным интервалом с использованием метода setInterval (что неудивительно). Взглянув на то, что делает setInterval, вы увидите, что он вызывает makeConnection для экземпляра источника данных. Этот метод звучит так, как будто он делает удаленный вызов, но это не обязательно.

Давайте посмотрим на пару строк из примера.

    // Set up polling
    var myCallback = {
        success: myDataTable.onDataReturnInitializeTable,
        failure: function() {
            YAHOO.log("Polling failure", "error");
        },
        scope: myDataTable
    }
    myDataSource.setInterval(5000, null, myCallback)

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

myDataSource.makeConnection(null, myCallBack)

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

В любом случае, просто следуйте примеру и выньте детали, которые вам не нужны. В конечном итоге похоже, что метод onDataReturnInitializeTable является ключевым.

Надеюсь, это поможет.

person Keith Bentrup    schedule 25.06.2009
comment
да, я имел в виду, что нельзя делать «new YAHOO.datatable()». Я не пытался добавлять и удалять строки вручную. я просто подумал, что действительно должен быть способ просто обновить всю таблицу. когда вызов YUI AJAX возвращается, он не может удалить все строки и повторно добавить их. это было бы безумием. - person Simon_Weaver; 26.06.2009
comment
@keith, это выглядит очень многообещающе. проверит это. и да, определенно нужно будет иметь возможность запускать это мгновенно, а не по таймеру - person Simon_Weaver; 26.06.2009

На самом деле, все, что я сделал, чтобы заставить его работать, это следующие две строки кода (и моя была возвращена из ajax, поэтому немного отличается от OP)...

dataTable.dataSource.liveData = eval(o.responseText);
dataTable.load({});

потому что, если вы прочтете, что делает datatable.load(), это то, что все предлагали звонить.

person Shane    schedule 31.10.2014