从单击 dgrid 列表的行中获取 id

Getting id from row clicked on a dgrid List

我刚开始使用 dgrid,并通过 dTunes 示例,我无法在列表中找到与每一行关联的 ID。这对我来说是很好的补救措施,但我如何才能获得从数据源发送的 ID?

 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"}]

我想看看这个id。相反,row.id returns 1,2 和 3,即行号(或创建的 id dgrid?)。

我认为问题可能出在我基于 dTunes 示例代码对我的代码进行建模,该示例代码有 3 个列表,其行为与常规网格略有不同。

目前,我正在使用列表中可用的 cachingStore。所以我得到 id 的方式:

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);
});

如果我尝试进行排序,我不确定这是否有效。

您还没有真正展示一个完整的示例,但考虑到您无论如何都在使用商店,如果让 dgrid 管理为您查询商店,您将有更轻松的时间。如果您使用 dgrid/OnDemandList(或 dgrid/List 加上 dgrid/extensions/Pagination),您可以将 dataCSTS 商店传递给 collection 属性,它将呈现它一切都是为了你,它会正确地获取你的 ID(因为 MemoryRequestMemory 扩展,默认使用 id 作为他们的身份 属性)。

如果您只使用 List 而不是 Grid,那么在 renderArray 之前最适合做您当前正在做的事情的地方可能是 renderRow 方法。 (List 中的默认设置只是 returns 一个 div 和一个包含传递给它的任何内容的文本节点;你将传递一个 object,所以你想挖掘任何 属性 你真的要先显示。)

如果您想要 header 行,请考虑设置 showHeader: true 并实施 renderHeader。 (在List中默认为false,但Grid将其设置为true并实现。)

您可能想查看 Grids and Stores tutorial