ExtJS:关联的 idProperty 的转换函数未触发

ExtJS: Associated idProperty's convert function not firing

在我的模型中,我将 idProperty 作为我使用计算函数构造的复合键(也尝试了转换函数)。但是,似乎无论您将哪个字段设置为 idProperty,calculate/convert 函数都不会触发。这在文档的某处有介绍吗?另外,我该如何规避这种情况?我想我可以听商店的负载并手动设置属性,但这很烦人。另外,我这样做是因为我想在刷新时保持网格先前的选择。

在下面的示例中,您会看到 console.log 没有触发,因此,当我单击 "Refresh" 按钮时,我的选择不会保留。这是 example:

Ext.application({
    name : 'Fiddle',

    launch : function() {
        Ext.define('MyModel', {
            extend: 'Ext.data.Model',
            idProperty: 'composite',
            fields: [{
                name: 'composite',
                type: 'string',
                calculate: function(data) {
                    console.log(data.name + data.num);
                    return ata.name + data.num;
                }
            }, {
                name: 'name',
                type: 'string'
            }, {
                name: 'num',
                type: 'int'
            }]
        });
        var store = Ext.create('Ext.data.Store', {
            model: 'MyModel',
            autoLoad: true,
            proxy: {
                type: 'ajax',
                url: 'data1.json'
            }
        });
        function onClickRefreshButton() {
            store.load();
        }
        var button = Ext.create('Ext.button.Button', {
            text: 'Refresh',
            renderTo: Ext.getBody(),
            listeners: {
                click: onClickRefreshButton
            }
        });
        var grid = Ext.create('Ext.grid.Panel', {
            store: store,
            renderTo: Ext.getBody(),
            height: 300,
            width: 300,
            title: 'My Grid',
            columns: [{
                text: 'Name',
                dataIndex: 'name'
            }, {
                text: 'Num',
                dataIndex: 'num'
            }]
        });
    }
});

我认为您可以在 reader 中使用 transform 函数,例如:

reader: {
    type: 'json',
    transform: {
        fn: function(res) {
            return res.map(function(item) {
                item.composite = item.name + item.num;

                return item;
            });
         }
      }
 }

If a transform function is set, it will be invoked just before readRecords executes. It is passed the raw (deserialized) data object. The transform function returns a data object, which can be a modified version of the original data object, or a completely new data object.

示例:https://fiddle.sencha.com/#fiddle/12bn

另一种方法是不设置

idProperty: 'composite',

在这种情况下,convert/calculate 按预期工作。

为什么不为idProperty调用convert/calculate:

idProperty 是唯一的并且永远不会改变(这是一个 属性 ID)因此它们不支持计算或转换。

因此必须在创建模型时设置它们。 工作代码 here

希望对您有所帮助!