从XML字符串而不是文件加载Extjs网格



我已经能够从外部XML文件中创建ExtJS网格。我通常对商店的定义如下:

var store = new Ext.data.Store({
    model: 'PersonModel',
    proxy: {
        type: 'ajax',
        url : 'MyXML.xml',
        reader: {
            type  : 'xml',
            record: 'Person'
        }
    }
});

我在其中一个字段中存储了一个XML片段,所以假设我在一个局部变量中存储了它。如何实现从变量/字符串而不是从文件读取存储?谢谢

我开始工作了。诀窍是定义一个内存类型的代理,然后将解析后的xml对象传递给它

var xmlstr =    "<personRecord>" +
                    "<Person>" +
                        "<firstName>Stan</firstName>" +
                        "<lastName>C</lastName>" +
                    "</Person>" +
                    "<Person>" +
                        "<firstName>Stanley</firstName>" +
                        "<lastName>D</lastName>" +
                    "</Person>" +
                "</personRecord>";

var doc;
if (window.ActiveXObject) {         //IE
    var doc = new ActiveXObject("Microsoft.XMLDOM");
    doc.async = "false";
    doc.loadXML(xmlstr);
} else {                             //Mozilla
    var doc = new DOMParser().parseFromString(xmlstr, "text/xml");
}

var memstore = new Ext.data.Store({
    autoLoad: true,
    model: 'Person',
    data : doc,
    proxy: {
        type: 'memory',
        reader: {
            type: 'xml',
            record: 'Person'
        }
    }
});

当我在代理中丢弃data:doc声明时,它就开始工作了。代理人:{数据:文档type:"内存"等等

EW

//这是我们将在商店中使用的模型

Ext.define('User', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'id',    type: 'int'},
        {name: 'name',  type: 'string'},
        {name: 'phone', type: 'string', mapping: 'phoneNumber'}
    ]
});

//这些数据与我们的型号字段不一致-电话字段被称为phoneNumber

var data = {
    users: [
        {
            id: 1,
            name: 'Ed Spencer',
            phoneNumber: '555 1234'
        },
        {
            id: 2,
            name: 'Abe Elias',
            phoneNumber: '666 1234'
        }
    ]
};

//注意我们如何在阅读器中设置"根"以匹配之上的数据结构

var store = new Ext.data.Store({
    autoLoad: true,
    model: 'User',
    data : data,
    proxy: {
        type: 'memory',
        reader: {
            type: 'json',
            root: 'users'
        }
    }
});

参考:http://docs.sencha.com/ext-js/4-0/#/api/Ext.data.proxy.Memory

我认为这样的东西可能会起作用(诚然,我还没有尝试过):

var data = "<user><name>Joe Bob</name></user>";
var store = new Ext.data.Store({
    model: 'PersonModel',
    data: data,
    proxy: {
        type: 'memory',
        reader: {
            type  : 'xml',
            record: 'Person'
        }
    }
});

您可能还想在商店的选项中添加autoLoad: true,这样您就不必调用store.load();

编辑:您可能还需要考虑稍微更改数据,以便阵列读取器可以使用它:http://docs.sencha.com/ext-js/4-0/#/api/Ext.data.reader.Array

您可以使用store.loadData(xmlVar);

最新更新