在ext网格中显示值,其中值对应于另一个表/模型中的字符串

时间:2011-07-01 23:48:48

标签: javascript extjs extjs4

我通过构建一个非常简单的“scrum”开发跟踪应用程序来教自己ExtJS。我目前正在显示“Backlog”作为网格面板,显示卡的属性(用户故事)。

Card.js(卡片型号)

Ext.define('AM.model.Card', {
    extend: 'Ext.data.Model',
    fields: [
                'id',
                'name',
                'priority_id',
                ...
            ]
});

Priority.js(优先级模型)

Ext.define('AM.model.Priority', {
    extend: 'Ext.data.Model',
    fields: [
                'id',
                'name',
                'short_name'
            ]
});

因此卡的数据看起来像这样:

backlogcards.json(数据)

{
    success: true,
    backlogcards: [
        {
            id: 1, 
            name: 'ONEs',
            priority_id: 2,
            ...
        },
        {
            id: 2, 
            name: 'TWOs',
            priority_id: 3,
            ...
        }
    ]
}

优先级如下:

priorities.json(数据)

{
    success: true,
    priorities: [
        {
            id              : 1, 
            name            : "High",
            short_name      : "H"
        },
        {
            id              : 2, 
            name            : "Medium",
            short_name      : "M"
        },
            {
            id              : 3, 
            name            : "Low",
            short_name      : "L"
        }
    ]
}

理想情况下,我想要做的是让网格面板显示相应priority_id的short_name。单击该项以进行内联编辑时,将显示一个显示name属性的组合框。我已经到了一半了。

BacklogList.js(查看)

Ext.define('AM.view.card.BacklogList', {
    extend: 'Ext.grid.Panel',
    alias: 'widget.backlogcardlist',

    title: 'Backlog',
    store: 'BacklogCards',

    selType: 'cellmodel',
    plugins: [
        Ext.create('Ext.grid.plugin.CellEditing', {
            clicksToEdit: 1
        })
    ],

    columns: [
        { header: 'ID', dataIndex: 'id' },
        { header: 'Name', dataIndex: 'name', field: 'textfield' },
        {
            header: 'Priority',
            dataIndex: 'priority_id',
            width: 130,
            field: {
                xtype: 'combobox',
                typeAhead: true,
                store: 'Priorities',
                displayField: 'name',
                valueField: 'id',
                listClass: 'x-combo-list-small'
            }
        }
    ]

});

所以我知道我需要修改'dataIndex'属性才能更改显示,但我不确定如何将这两个商店绑在一起。

Row Editing

如上所示,优先级显示为数字而不是short_name。

这是我需要使用关联的情况吗? (我只知道他们)Sencha Docs

谢谢!

EDIT1:哦,我意识到我可以“硬编码”渲染器属性进行此更改,但我想避免这种情况,而是使用优先级存储中的值。

    renderer: function(value){
        if (value==3)
        {
            return "L";
        }
        else if (value==2)
        {
            return "M";
        }
        else
        {
            return "H";
        }
    },

Evan的EDIT2: 优先商店

Ext.define('AM.store.Priorities', {
    extend: 'Ext.data.Store',
    model: 'AM.model.Priority',
    autoLoad: true,

    proxy: {
        type: 'ajax',
        api: {
            read: 'app/data/priorities.json',
            update: 'app/data/updateUsers.json'
        },
        reader: {
            type: 'json',
            root: 'priorities',
            successProperty: 'success'
        }
    }
});

store.each指的是这家商店,对吧?如果是这样,我该如何对其执行每个操作?

我尝试将申报行更改为:

var test = Ext.define('AM.store.Priorities', {

然后尝试将代码更改为test.each但未成功。

再次感谢!

1 个答案:

答案 0 :(得分:4)

您需要使用渲染器,但是没有什么可以阻止您循环优先级存储中的值并进行检查,例如:

renderer: function(value) {
    var display = '';
    store.each(function(rec){
        if (rec.get('id') === value) {
            display = rec.get('name');
            return false;
        }
    });
    return display;
}