开发者

Displaying values in an ext grid where the values correspond to strings in another table/model

I'm teaching myself ExtJS by building a really simple 'scrum' development tracking application. I'm currently displaying the "Backlog" as a grid panel that displays the properties of the card(user story).

Card.js (Card model)

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

Priority.js (Priority model)

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

So the data for the card will look something like this:

backlogcards.json (data)

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

And the priorities looks like this:

priorities.json (data)

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

So ideally what I would like to do is have the grid panel display the short_name for the corresponding priority_id. When the item is clicked on to be edited inline, a combo box will be displayed that shows the name property. I'm half way there already.

BacklogList.js (view)

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

});

So I know the 'dataIndex' property is what I need to modify in order to change the display, but I'm not sure how to tie those two stores together.

Displaying values in an ext grid where the values correspond to strings in another table/model

As you can see above, priority is being displayed as a number instead of the short_name.

Is this a situation where I would need to use associations? (I only know OF them) Sencha Docs

Thank you!

EDIT1: Oh I realize I could 'hard code' a renderer property that does this change, but I would like to avoid that and instead use values from the priorities store.

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

EDIT2 for Evan: Priorities store

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

The store.each refers to this store, right? If so, how do I perform the each operation on it?

I tried changing the declaration line to:

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

And then tried changing your code to test.each but was unsuccessful.

Thanks again!


You need to use a renderer, however there's nothing stopping you from looping over the values in the priorities store and checking, something like:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜