编程语言
首页 > 编程语言> > javascript-嵌套XML数据和ExtJS模型关联

javascript-嵌套XML数据和ExtJS模型关联

作者:互联网

我正在尝试将XML数据映射到ExtJS中的一系列模型.我能够从顶级模型中提取数据,但是,与它的关联无法检索必要的数据.

这是我所有的模型:

Ext.define('app.model.ProductType', {
    extend: 'Ext.data.Model',
    idProperty: 'id',
    fields: [{
        name: 'id',
        mapping: 'id',
        type: 'int'
    }, {
        name: 'name',
        mapping: 'name',
        type: 'string'
    }, {
        name: 'sometag',
        mapping: 'sometag',
        type: 'string'
    }],
    associations: [{
        type: 'hasMany',
        model: 'app.model.Address',
        name: 'addresses',
        autoLoad: true,
        reader: {
            type: 'xml',
            record: 'address',
            root: 'addressList'
        }
    }, {
        type: 'hasMany',
        model: 'app.model.PhoneContact',
        name: 'contacts',
        autoLoad: true,
        reader: {
            type: 'xml',
            record: 'phoneContact',
            root: 'phoneContactList'
        }
    }, {
        type: 'hasOne',
        model: 'app.model.OneToOne',
        name: 'oneToOne',
        autoLoad: true,
        reader: {
            type: 'xml',
            record: 'oneToOne'
        }
    }],
    proxy: {
        type: 'ajax',
        url: 'data/example.xml',
        reader: {
            type: 'xml',
            record: 'ProductType',
            root: 'ProductResultSet'
        }
    }
});

地址:

Ext.define('app.model.Address', {
    extend: 'Ext.data.Model',
    fields: [{
        name: 'city',
        mapping: 'city',
        type: 'string'
    }, {
        name: 'street',
        mapping: 'street',
        type: 'string'
    }],
    associations: [{
        type: 'belongsTo',
        model: 'app.model.ProductType'
    }]
});

联系电话:

Ext.define('app.model.PhoneContact', {
    extend: 'Ext.data.Model',
    fields: [{
        name: 'primary',
        mapping: 'primary',
        type: 'string'
    }, {
        name: 'cell',
        mapping: 'cell',
        type: 'string'
    }],
    associations: [{
        type: 'belongsTo',
        model: 'app.model.ProductType'
    }]
});

一对一:

Ext.define('app.model.OneToOne', {
    extend: 'Ext.data.Model',
    fields: [{
        name: 'first',
        mapping: 'firstfield',
        type: 'string'
    }, {
        name: 'second',
        mapping: 'secondfield',
        type: 'string'
    }],
    associations: [{
        type: 'belongsTo',
        model: 'app.model.ProductType'
    }]
});

这是我的app.js

Ext.Loader.setConfig({
    enabled: true
});

Ext.application({
    name: 'app',
    autoCreateViewport: false,
    requires: ['app.model.ProductType', 'app.model.Address', 'app.model.PhoneContact', 'app.model.OneToOne', 'app.store.ProductTypeStore'],
    launch: function () {
        app.model.ProductType.load(55, {
            scope: this,
            callback: function (record, operation) {
                console.log('Record Addresses:');
                console.log(record.addresses());
            }
        });

        var s = app.store.ProductTypeStore.create();
        s.on('load', this.wiggidy, this);
        s.load();
    },
    wiggidy: function (store, records, success, eOpts) {
        var rec = store.getAt(0);
        console.log('Associated Data:');
        console.log(rec.getAssociatedData());
    }
});

最后是example.xml

<ProductResultSet>
<ProductType>
    <id>55</id>
    <name>Product Name</name>
    <sometag>asdf</sometag>
    <addressList>
        <address>
            <street>12345 a</street>
            <city>myCity</city>
        </address>
        <address>
            <street>234567 b</street>
            <city>Denver</city>
        </address>
    </addressList>
    <phoneContactList>
        <phoneContact>
            <primary>234</primary>
            <cell>4667</cell>
        </phoneContact>
        <phoneContact>
            <primary>5467</primary>
            <cell>87904</cell>
        </phoneContact>
    </phoneContactList>
    <oneToOne>
        <firstField>value</firstField>
        <secondField>value</secondField>
    </oneToOne>
</ProductType>
</ProductResultSet>

控制台为RecordAddresses输出吐出“ Uncaught TypeError:无法调用未定义的方法’indexOf’”,然后为关联数据输出获得一个对象,该对象充满了具有0个对象的数组.

我完全被这个困扰.我到处搜寻,到现在为止我已经走了.为什么记录未在该xml文件中加载嵌套数据?

任何帮助将不胜感激.

解决方法:

为什么在hasMany关系中设置autoLoad = true?

您尝试使用嵌套数据,然后告诉它按需加载数据,并且想知道为什么没有嵌套数据:)

您还缺少嵌套加载所需的associationKey.

这是您的代码的工作示例:

http://jsfiddle.net/el_chief/668Fg/5/

将来遵循我的“规则”,一切都会好起来的:

http://extjs-tutorials.blogspot.ca/2012/05/extjs-hasmany-relationships-rules.html

标签:extjs,nested,associations,xml,javascript
来源: https://codeday.me/bug/20191101/1980909.html