Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何访问Extjs嵌套模型(从Xml加载)?_Xml_Model_Extjs4 - Fatal编程技术网

如何访问Extjs嵌套模型(从Xml加载)?

如何访问Extjs嵌套模型(从Xml加载)?,xml,model,extjs4,Xml,Model,Extjs4,很难理解模型的“关联”特性以及如何 开发人员可以通过关联访问嵌套数据 下面是一个简单的XML文件,我们正试图解析它 <?xml version="1.0" encoding="UTF-8"?> <contacts> <contact> <id>1</id> <name>Bob Jones</name> <emails> &

很难理解模型的“关联”特性以及如何 开发人员可以通过关联访问嵌套数据

下面是一个简单的XML文件,我们正试图解析它

<?xml version="1.0" encoding="UTF-8"?>
<contacts>
    <contact>
        <id>1</id>
        <name>Bob Jones</name>
        <emails>
            <email>
                <addr>bjones1@dom.com</addr>
                <display>B. Jones 1</display>
            </email>
            <email>
                <addr>bjones2@dom.com</addr>
                <display>B. Jones 2</display>
            </email>
        </emails>
    </contact>
    <contact>
        <id>2</id>
        <name>John Rodeo</name>
        <emails>
            <email>
                <addr>jrodeo1@dom.com</addr>
                <display>J. Rodeo 1</display>
            </email>
            <email>
                <addr>jrodeos2@dom.com</addr>
                <display>J. Rodeo 2</display>
            </email>
        </emails>
    </contact>
</contacts>
最后,这里是商店:

Ext.define('MyApp.store.MyXmlStore', {
    extend: 'Ext.data.Store',
    requires: [
        'MyApp.model.Contact'
    ],

    constructor: function(cfg) {
        var me = this;
        cfg = cfg || {};
        me.callParent([Ext.apply({
            autoLoad: true,
            storeId: 'MyXmlStore',
            model: 'MyApp.model.Contact',
            proxy: {
                type: 'ajax',
                url: 'data/data.xml',
                reader: {
                    type: 'xml',
                    record: 'contact'
                }
            }
        }, cfg)]);
    }
});
我们创建了一个简单的网格并将其链接到商店…和presto, 它显示联系人(快速ascii呈现)

但是我们完全不知道如何检索相关的电子邮件 记录

我读到GridPanel可能无法正确渲染关联的 数据。这对我们来说没问题,我们只是想开动脑筋 我们如何使用该模型数据以编程方式访问它

例如,假设我们想要创建一个简单的onXmlstoreLoad事件 加载后,我们只需要console.log()来记录电子邮件地址 --正确的语法是什么

我们尝试了推荐的方法:

onXmlstoreLoad: function(store, records, successful, operation, options) {
    console.log(store.emailAddresses.getAt(0));
} 
但这会导致一个未定义的引用

我承认这可能归结为我们对模型的描述不正确,但我们已经尝试过了 几十种不同的配置,无法确定问题是否存在 是数据没有进入商店…还是我们不能参考
语法正确。

最终找到了我所缺少的东西,以便能够正确地读取嵌套模型。一旦我们正确地填充了我们的存储,访问嵌套数据记录就很简单了

我们缺少的关键部分是代理/读取器。每个模型都需要有自己的代理读取器,以便您可以指定“记录”和“根”参数

我建议任何一个偶然发现这个帖子的人去看看Neil McGuigan维护的优秀网站--。这里有很多重要的提示和最佳实践,你应该遵循

Neil为我们的解决方案提供的一条重要线索是,开发人员应该将代理和阅读器挂在模型之外,而不是商店之外。这使得管理特定于Xml的记录/根参数变得简单

当这是一个艰难的一个…对于任何人谁第一次进入了Extjs的深层次,我强烈建议你与Firebug近距离接触。进入extjs源代码,我们开始回答许多重要的问题,这些问题涉及到各种比特和片段是如何组合在一起的

extjs代码库的文档非常丰富。尽管开发人员显然是Javascript中的黑带,这有时会让他们面临挑战,但最终的结果是值得付出努力的

如果您正在寻找工作代码

我们的商店

Ext.define('MyApp.store.MyXmlStore', {
    extend: 'Ext.data.Store',
    requires: [
        'MyApp.model.Contact'
    ],

    constructor: function(cfg) {
        var me = this;
        cfg = cfg || {};
        me.callParent([Ext.apply({
            autoLoad: true,
            storeId: 'MyXmlStore',
            model: 'MyApp.model.Contact',
            listeners: {
                load: {
                    fn: me.onXmlstoreLoad,
                    scope: me
                }
            }
        }, cfg)]);
    },

    onXmlstoreLoad: function(store, records, successful, operation, options) {
        console.log("onXmlstoreLoad:"+ successful);
        console.log(s.getAt(0).emailAddressesStore.getAt(0));

    }

});
还有我们的模型

Ext.define('MyApp.model.Contact', {
    extend: 'Ext.data.Model',
    uses: [
        'MyApp.model.Emails'
    ],

    fields: [
        {
            mapping: 'id',
            name: 'id',
            type: 'int'
        },
        {
            mapping: 'name',
            name: 'name',
            type: 'string'
        }
    ],

    hasMany: {
        associationKey: 'emails',
        model: 'MyApp.model.Emails',
        name: 'emailAddresses'
    },

    proxy: {
        type: 'ajax',
        url: 'data/data.xml',
        reader: {
            type: 'xml',
            root: 'contacts',
            record: 'contact'
        }
    }
});
Ext.define('MyApp.model.Emails', {
    extend: 'Ext.data.Model',
    uses: [
        'MyApp.model.Contact'
    ],

    fields: [
        {
            mapping: 'addr',
            name: 'addr',
            type: 'string'
        },
        {
            mapping: 'display',
            name: 'display',
            type: 'string'
        }
    ],

    proxy: {
        type: 'ajax',
        url: 'data/data.xml',
        reader: {
            type: 'xml',
            root: 'emails',
            record: 'email'
        }
    },

    belongsTo: {
        model: 'MyApp.model.Contact'
    }
});
Ext.define('MyApp.store.MyXmlStore', {
    extend: 'Ext.data.Store',
    requires: [
        'MyApp.model.Contact'
    ],

    constructor: function(cfg) {
        var me = this;
        cfg = cfg || {};
        me.callParent([Ext.apply({
            autoLoad: true,
            storeId: 'MyXmlStore',
            model: 'MyApp.model.Contact',
            listeners: {
                load: {
                    fn: me.onXmlstoreLoad,
                    scope: me
                }
            }
        }, cfg)]);
    },

    onXmlstoreLoad: function(store, records, successful, operation, options) {
        console.log("onXmlstoreLoad:"+ successful);
        console.log(s.getAt(0).emailAddressesStore.getAt(0));

    }

});
Ext.define('MyApp.model.Contact', {
    extend: 'Ext.data.Model',
    uses: [
        'MyApp.model.Emails'
    ],

    fields: [
        {
            mapping: 'id',
            name: 'id',
            type: 'int'
        },
        {
            mapping: 'name',
            name: 'name',
            type: 'string'
        }
    ],

    hasMany: {
        associationKey: 'emails',
        model: 'MyApp.model.Emails',
        name: 'emailAddresses'
    },

    proxy: {
        type: 'ajax',
        url: 'data/data.xml',
        reader: {
            type: 'xml',
            root: 'contacts',
            record: 'contact'
        }
    }
});
Ext.define('MyApp.model.Emails', {
    extend: 'Ext.data.Model',
    uses: [
        'MyApp.model.Contact'
    ],

    fields: [
        {
            mapping: 'addr',
            name: 'addr',
            type: 'string'
        },
        {
            mapping: 'display',
            name: 'display',
            type: 'string'
        }
    ],

    proxy: {
        type: 'ajax',
        url: 'data/data.xml',
        reader: {
            type: 'xml',
            root: 'emails',
            record: 'email'
        }
    },

    belongsTo: {
        model: 'MyApp.model.Contact'
    }
});