【问题标题】:ExtJs 3.4 updating data in XTemplateExtJs 3.4 更新 XTemplate 中的数据
【发布时间】:2019-12-07 10:40:40
【问题描述】:

我有一个面板,它的模板定义如下:

this.personalPanel = new Ext.Panel({
    title: 'Personal',
    autoScroll: true,
    tpl: new Ext.XTemplate(
        '<div class="addressbook-preview-panel">',
        '<div><span>ID     </span>{[this.encode(values.id, "mediumtext")]}</div>',
        '<div><span>PIN    </span>{[this.encode(values.pin, "mediumtext")]}</div>',
        '<div><span>Address</span>{address_mm}</div>',
        '</div>', {
            encode: function (value, type, prefix) {
                return self.encode.apply(self, arguments);
            }
        })
});

现在最初加载时只加载 ID 和 PIN,我想根据 AJAX 请求填写地址。问题是当我尝试更新该字段时,现有值被覆盖并且我只看到地址(我已缩短对this.personalPanel 的调用,但实际上它是从另一个文件调用的,而不是它定义的文件)。

this.personalPanel.update({address_mm: something.something});

我尝试查看tplWriteMode,因为它默认设置为overwrite,但这并没有帮助,因为其他选项只是在现有内容之前或之后添加另一个模板,所以我有一个副本。

【问题讨论】:

    标签: javascript html extjs extjs3


    【解决方案1】:

    因为你正在使用下面的代码

    this.personalPanel.update({address_mm: something.something});
    

    所以它会过度使用之前的对象/数据。您需要将Object.assign() 与前一个数据和新数据一起使用。如下所示

    newData = Object.assign({
        address_mm: 'this new address'
    }, panel.custObj))
    

    代码片段和Sencha Fiddle

    Ext.onReady(function () {
        var personalPanel = new Ext.Panel({
            title: 'Personal',
            autoScroll: true,
            id: 'personalPnl',
            custObj:{},//custom property
            buttons: [{
                text: 'Refresh Data',
                handler: function (btn) {
                    //This will be your second load data, you can merge with same custome object,
                    //you need to do becuase you are taking data in panel, you are doing dynamically
                    var panel = Ext.getCmp('personalPnl'),
                        newData = Object.assign({
                            address_mm: 'this new address'
                        }, panel.custObj);
    
                    panel.update(newData);
                }
            }],
            tpl: new Ext.XTemplate(
                '<div class="addressbook-preview-panel">',
                '<div><span>ID  :</span>{[this.encode(values.id, "mediumtext")]}</div>',
                '<div><span>PIN :</span>{[this.encode(values.pin, "mediumtext")]}</div>',
                '<div><span>Address :</span>{address_mm}</div>',
                '</div>', {
                    encode: function (value, type, prefix) {
                        return value; //self.encode.apply(self, arguments);
                    }
                })
        });
    
        personalPanel.render(document.body);
        // this is will be your first load data
        personalPanel.custObj = {
            id: 1,
            pin: '4501111'
        };
        personalPanel.update(personalPanel.custObj);
    });
    

    【讨论】:

    • 当您准备好初始数据时,这确实有效,就像您使用 data: {...} 一样,但是这是一个动态属性,它最初是空的。在第一次请求后它被填充(因此initialConfig.data 在第一次请求之前为空),第二次请求填写地址。由于配置为空,使用Object.assign 更新也会重写它,因为它附加到空数据
    • 正如最初在加载时提到的,仅加载了 ID 和 PIN,您的数据是如何来的? id,pin 和其他东西?
    • 是的,完全正确。在页面加载时运行 AJAX 填充 ID 和 PIN,然后在元素选取上的另一个 AJAX 应该填充地址
    • 好的,有一个解决方案,您可以在面板内分配您的第一个对象,例如 panel.custObj= {},然后在第二次加载时,您可以与之合并
    • 根据您的动态更新,您需要在面板或全局内部维护一个自定义变量。我已更新我的答案,请检查。当您使用更新方法时,它在内部调用 overwrite : function(el, values, returnElement){ el = Ext.getDom(el); el.innerHTML = this.applyTemplate(values); return returnElement ? Ext.get(el.firstChild, true) : el.firstChild; } 而这个 overwrite 将更新您的 dom 元素。
    猜你喜欢
    • 2012-12-03
    • 2011-02-06
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多