ExtJs与转换器绑定(公式)

时间:2017-01-26 10:49:18

标签: javascript extjs data-binding extjs6 extjs6-classic

如果有可能像WPF转换器这样的东西,我想在绑定中使用。在ExtJs示例中,我看到三种类型:

  1. “{}字段”
  2. “Hello {field}”
  3. “{!字段}”
  4. 这个例子很好用。

       Ext.create('Ext.grid.Panel', {
            store: store,
            columns: [
                {
                    xtype: 'widgetcolumn',
                    width: 50,
                    align: 'left',
                    widget: {
                        xtype: 'label',
                        bind: {
                            text: "{record.Text}",
                        }
                    }
                },
            ]
        });
    

    但我需要更多。在飞行中改变somethig或计算。例如,根据来自记录的一些信息或者来自许多领域的信息和组合信息来改变标签的样式。我想要这样想:

    Ext.create('Ext.grid.Panel', {
            store: store,
            columns: [
                {
                    xtype: 'widgetcolumn',
                    width: 50,
                    align: 'left',
                    widget: {
                        xtype: 'label',
                        bind: {
                            text: "{calculateText(record)}",
                            style: {
                                color: "{calculateColor(record)}"
                            }
                        }
                    }
                },
            ]
        });
    

    我读到有关公式的内容,我尝试了:

     Ext.create('Ext.grid.Panel', {
            store: store,
            columns: [
                {
                    xtype: 'widgetcolumn',
                    width: 50,
                    align: 'left',
                    widget: {
                        xtype: 'label',
                        viewModel:{
                            formulas: {
                                myText: function(get){
                                    return get('record').Text + '$';
                                },
                            }
                        },
                        bind: {
                            text: "{myText}",
    
                        }
                    }
                },
            ]
        });
    

    和这个

    Ext.create('Ext.grid.Panel', {
            store: store,
            columns: [
                {
                    xtype: 'widgetcolumn',
                    width: 50,
                    align: 'left',
                    widget: {
                        xtype: 'label',
                        viewModel:{
                            formulas: {
                                myText: {
                                    bind: {
                                        text: "{record.Text}",                                    
                                    },
                                    get: function(data){
                                        return data.text + '$';
                                    },
    
                                },
                            }
                        },
                        bind: {
                            text: "{myText}",
    
                        }
                    }
                },
            ]
        });
    

    但是当我尝试将我的ViewModel添加到当前上下文时 - 带有“record”的父ViewModel松散且无法正常工作。 我做错了什么以及如何做到这一点?

2 个答案:

答案 0 :(得分:2)

我使用rowViewModel配置解决了我的问题。例如:

Ext.create('Ext.grid.Panel', {
        store: store,
        rowViewModel: {
            formulas: {
                myText: function(get){
                    return get('record.Text') + '$';
                },
            }
        },
        columns: [
            {
                xtype: 'widgetcolumn',
                width: 50,
                align: 'left',
                widget: {
                    xtype: 'label',                        
                    bind: {
                        text: "{myText}",

                    }
                }
            },
        ]
    });

答案 1 :(得分:1)

您可以将父视图模型作为viewmodel config的一部分传递。

viewModel:{
    parent: this.getViewModel(),
    formulas: {
        myText: {
            bind: {
                text: "{record.Text}",                                    
            },
            get: function(data){
                return data.text + '$';
            }
        }
    }
}