ExtJS - 如何在未绑定到商店的列表 itemTpl 中使用变量

Posted

技术标签:

【中文标题】ExtJS - 如何在未绑定到商店的列表 itemTpl 中使用变量【英文标题】:ExtJS - How to use a variable within a list itemTpl that isn't bound to the store 【发布时间】:2021-08-19 18:14:46 【问题描述】:

如何让列表的itemTpl 解释不属于其直接存储/数据绑定的变量?比如我想引用一个父组件的一些viewModel数据。这是我能想到的最简单的例子:

Ext.define('ListItemTplTest.view.main.MainView', 
    extend: 'Ext.Container',
    xtype: 'mainview',

    viewModel : 
        data : 
            message: 'is available'
        
    ,

    items: [
        
            xtype: 'list',
            itemTpl: 'title message', // how to get the itemTpl to interpret the message variable?
            data: [
                 title: 'Item 1' ,
                 title: 'Item 2' ,
                 title: 'Item 3' ,
                 title: 'Item 4' 
            ]
        
    ]
)

假设 viewModel 的 message 属性可以更新为不同的值(例如/按下按钮,控制器将更新消息),因此将 'is available' 硬编码到 itemTpl 将不起作用。

虽然我的实际用例有点不同(子和父存储而不是子和父数据),但基本原理是相同的:我的列表组件需要解释来自父数据源的变量。

这适用于使用现代工具包的 ExtJS 7.3.1。

【问题讨论】:

同样可以写js函数。在该函数中,您可以访问任何内容。 ***.com/questions/2611820/… 当我添加这样一个函数并放置一个调试器时,我可以访问的内容非常有限。除了 xtemplate 支持的变量out, values, parent, xindex, xcount, xkeythis 上几乎没有任何数据。例如,this.getViewModel()、this.lookup() 等不起作用。那么如何从那里访问我的父视图模型? 我不是说通过 args 访问任何东西,但我是说你可以通过 Ext.getStore() 访问任何组件或其他商店等其他东西。 【参考方案1】: https://docs.sencha.com/extjs/6.5.3/modern/Ext.dataview.List.html#cfg-viewModel

根据文档,例如可以绑定数据属性。

这是一个小提琴:https://fiddle.sencha.com/#view/editor&fiddle/3dvl

  let list = Ext.create(
        xtype: 'list',
        viewModel: 
            data: 
                tplData: [
                    title: 'Item 1',
                    message: 'a'
                , 
                    title: 'Item 2',
                    message: 'b'
                , 
                    title: 'Item 3',
                    message: 'c'
                , 
                    title: 'Item 4',
                    message: 'd'
                ]
            
        ,
        fullscreen: true,
        itemTpl: 'title message',
        bind: 
            data: 'tplData'
        
    );
    
    Ext.defer(function() 
        list.getViewModel().set('tplData', [
            title: 'Item 4',
            message: 'a'
        ])
        list.getViewModel().notify() // not sure if really needed
    .bind(list), 2000)

【讨论】:

以上是关于ExtJS - 如何在未绑定到商店的列表 itemTpl 中使用变量的主要内容,如果未能解决你的问题,请参考以下文章

extjs 5 商店同步绑定到选择 hasMany

Extjs 将另一个商店作为另一个属性绑定到网格

ExtJS:如何使用别名/xtype 来引用其他组件

ExtJS:如何将一个商店的记录插入另一个商店?

ExtJS ComboBox 列表,带有基于商店数据的图标和文本

ExtJS:如何让用户在 Combobox 中输入不在商店中的值