Получение идентификатора из строки, нажатой в списке dgrid

Я только начал использовать dgrid и, просматривая образец dTunes, не могу найти идентификатор, связанный с каждой строкой в ​​списке. С моей стороны это довольно полезно, но как мне также получить идентификатор, который я отправил из источника данных?

 define([
'require',
'dgrid/List',
'dgrid/OnDemandGrid',
'dgrid/Selection',
'dgrid/Keyboard',
'dgrid/extensions/ColumnHider',
'dojo/_base/declare',
'dojo/_base/array',
'dojo/Stateful',
'dojo/when',
'dstore/RequestMemory',
'put-selector/put',
'dojo/domReady!'
 ], function (require, List, Grid, Selection, 
        Keyboard, Hider, declare, arrayUtil, Stateful, 
        when, RequestMemory, put) {

 var cstsNode = put(listNode, 'div#cstsCars');
 ...

var cstsList = new TunesList({}, cstsNode);
var dataCSTS = new RequestMemory({ target: require.toUrl('./dataCSTS.json') });

...

dataCSTS.fetch().then(function (cars) {
    cstsCars = arrayUtil.map(cars, pickField('Description'));
    cstsCars.unshift('All (' + cstsCars.length + ' CSTS Cars' + (cstsCars.length !== 1 ? 's' : '') + ')');
    cstsList.renderArray(cstsCars);
});

...

cstsList.on('dgrid-select', function (event) {
    var row = event.rows[0];
    console.log(row.id);  // shows row number.  How do I get the real id or other fields?
    console.log(row.data);  // shows row text that is displayed ("sample text 1")
    console.log(row.data.id); // undefined
});

Вот фрагмент примера данных, который я предоставляю:

 [{"id":"221","Description":"sample text 1"},
 {"id":"222","Description":"sample text 2"}, 
 {"id":"223","Description":"sample text 3"}]

Я хотел бы увидеть идентификатор. Вместо этого row.id возвращает 1,2 и 3, т.е. номера строк (или id созданного dgrid?).


person Dave    schedule 16.03.2015    source источник
comment
что вы подразумеваете под реальным идентификатором? Можете ли вы предоставить более подробную информацию с данными? row.data возвращает фактические данные, хранящиеся в массиве объектов, которые могут соответствовать или не соответствовать данным, отображаемым в сетке. Трудно понять, чего вы пытаетесь достичь.   -  person frank    schedule 16.03.2015
comment
Поле id будет в объекте data. то есть console.log (row.data.id), а не row.id. row.id — это внутреннее представление dGrid.   -  person frank    schedule 16.03.2015
comment
Может быть, что-то еще не так, потому что row.data.id не определен, так как row.data — это просто текст. Правильно ли определен мой объект строки?   -  person Dave    schedule 16.03.2015
comment
Вы можете показать нам, что такое содержимое row.data? Если это строка JSON, вам нужно преобразовать ее в объект массива JSON и использовать его в качестве данных для сетки.   -  person frank    schedule 16.03.2015
comment
Вам нужно хранить данные как объект массива. Я думаю, что проблема именно в этом. Должно быть var data = [{"id":"221","Description":"sample text 1"}, {"id":"222","Description":"sample text 2"}, {"id":"223","Description":"sample text 3"}];   -  person frank    schedule 16.03.2015
comment
Я до сих пор не уверен, что происходит, поэтому я добавил больше кода, показывающего, как эти данные считываются и преобразуются. Файл содержит строку json, которая, как я думал, преобразуется в соответствующий объект.   -  person Dave    schedule 16.03.2015
comment
Следующая строка кода в вашем сообщении cstsReasons = arrayUtil.map(reasons, pickField('Description')); создает только массив объектов с полем Description. то есть `[{Описание: образец текста 1}, {Описание: образец текста 2}, {Описание: образец текста 3}]` Который затем передается dGrid для рендеринга. Вам нужно построить хранилище памяти, где будут храниться все данные, а не только их часть.   -  person frank    schedule 16.03.2015
comment
Давайте продолжим обсуждение в чате.   -  person Dave    schedule 16.03.2015


Ответы (2)


На самом деле вы не показали полный пример, но, учитывая, что вы все равно используете хранилище, вам будет намного легче, если вы позволите dgrid управлять запросом хранилища для вас. Если вы используете dgrid/OnDemandList (или dgrid/List плюс dgrid/extensions/Pagination), вы можете передать свой магазин dataCSTS свойству collection, он отобразит все это для вас и правильно подберет ваши идентификаторы (поскольку Memory и RequestMemory по расширению, по умолчанию используется использование id в качестве их идентификационного свойства).

Наиболее подходящим местом для выполнения того, что вы сейчас делаете до renderArray, вероятно, будет метод renderRow, если вы просто используете список, а не сетку. (По умолчанию в List просто возвращается div с текстовым узлом, содержащим все, что ему передается; вы будете передавать объект, поэтому вам нужно сначала выкопать любое свойство, которое вы действительно хотите отобразить.)

Если вам нужна строка заголовка, рассмотрите возможность установки showHeader: true и реализации renderHeader. (По умолчанию в List это false, но Grid устанавливает для него значение true и реализует его.)

Вы можете ознакомиться с руководством по сетям и хранилищам.

person Ken Franqueiro    schedule 16.03.2015
comment
Я новичок в dGrid (и в додзё), поэтому спасибо за ваше терпение и разъяснения. Я рассмотрю возможность использования OnDemandList. Мне действительно нужен только один столбец, поэтому список кажется подходящим. - person Dave; 17.03.2015
comment
На самом деле я нашел мало информации о OnDemandList, поэтому я просто изменил эти списки на обычные сетки, и теперь все просто. - person Dave; 17.03.2015

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

Пока я использую cachingStore, доступный в списках. Итак, как я получаю идентификатор:

cstsList.on('dgrid-select', function (event) {
    var row = event.rows[0];
    var id = storeCSTS.cachingStore.data[row.id - 1].id; // -1 because a header was added
    console.log(id);
});

Я не уверен, сработает ли это, если я когда-нибудь попытаюсь выполнить сортировку.

person Dave    schedule 16.03.2015