Как лучше всего синхронизировать RecordSet YUI DataTable с массивом JavaScript? - PullRequest
1 голос
/ 03 февраля 2011

У меня есть массив javascript, который я использую в качестве источника данных в редактируемом виде данных YUI:

var data = [
    { Col1: "one", Col2: 1 },  
    { Col1: "two", Col2: 2 },      
    { Col1: "three", Col2: 3 },
    { Col1: "four", Col2: 4 }
];
var customFormatter = function (elLiner, oRecord, oColumn, oData) {
    elLiner.innerHTML = "Click me";
    $(elLiner).click(function () {
        var rsvalue = oRecord.getData("Col1");
        var datavalue = data[oRecord.getCount()].Col1;;
        alert("rs:" + rsvalue + ", data:" + datavalue);
    });
};
var coldefs = [
    { key: "Col1", editor: new YAHOO.widget.TextboxCellEditor() },
    { key: "Col2" },
    { key: "Col3", formatter: customFormatter }
];
var datasource = new YAHOO.util.DataSource(data);
datasource.responseType = YAHOO.util.DataSource.TYPE_JSARRAY;
datasource.responseSchema = { fields: [ "Col1", "Col2" ] };
var datatable = new YAHOO.widget.DataTable("mytable", coldefs, datasource);
datatable.subscribe("cellClickEvent", datatable.onEventShowCellEditor);

Когда я изменяю значение в редактируемых ячейках, я вижу, что запись таблицы данных обновляется новым значением, а базовый массив data - нет. Я хотел бы поработать с этим массивом javascript (или с другим по форме), когда пользователь закончит редактирование данных, где мне нужно будет выполнить некоторую постобработку и отправить ее на сервер. В целом хороших примерах YUI я не вижу, чтобы они когда-либо пытались согласовать изменения, внесенные в источник данных, с базовым источником данных. Существует ли такой пример? Каков наилучший способ вернуть мои изменения обратно в массив data?

Вот jsfiddle с моим маленьким тестом: http://jsfiddle.net/cfarmerga/uArKs/1/

Должен ли я просто поймать editorSaveEvent s для DataTable и просто пройти набор записей и обновить мой массив javascript?

1 Ответ

2 голосов
/ 10 февраля 2011

Если возможно, я бы предложил перестроить массив данных один раз после того, как пользователь закончил редактирование, выполнить любую постобработку и затем отправить ее на сервер.Это было бы более эффективно, чем пытаться синхронизировать источник данных и массив после каждого отдельного редактирования.Чтобы перестроить массив, вы можете перебрать RecordSet таблицы данных.

var rs = datatable.getRecordSet(),
    len = rs.getLength(),
    data = [];

for (var index=0; index < len; index++) {
    data.push(rs.getRecord(index).getData());
}

Обратите внимание, что getData () возвращает объект, представляющий всю запись.Вы также можете передать отдельные ключи в getData () (например, getData ("Col1")), чтобы получить отдельные поля записи.

...