Extjs4.2 model关联读复杂XML

目标XML文件内容

<?xml version="1.0" encoding="UTF-8"?>
<teacherList>
	<teacherTotal>2</teacherTotal>
	<teacher>
		<name>teacher1</name>
		<sex>F</sex>
		<hasManyStudent>//这一层必须得有,对应model中hasmany name
			<studentTotal>2</studentTotal>
			<student>
				<name>student1_1</name>
				<sex>M</sex>
			</student>
			<student>
				<name>student1_2</name>
				<sex>F</sex>
			</student>
		</hasManyStudent>
	</teacher>
	<teacher>
		<name>teacher2</name>
		<sex>M</sex>
		<hasManyStudent>//这一层必须得有,对应model中hasmany name
			<studentTotal>2</studentTotal>
			<student>
				<name>student2_1</name>
				<sex>M</sex>
			</student>
			<student>
				<name>student2_2</name>
				<sex>M</sex>
			</student>
		</hasManyStudent>
	</teacher>
</teacherList>
teacher model

Ext.define('AM.model.teacher', {
    extend: 'Ext.data.Model',

    requires: [
        'Ext.data.Field',
        'Ext.data.proxy.Ajax',
        'Ext.data.reader.Xml',
        'Ext.data.association.HasMany'
    ],
    uses: [
        'AM.model.student'
    ],

    fields: [
        {
            name: 'sex'
        },
        {
            name: 'name'
        }
    ],

    proxy: {  //关联model貌似必须各自定义自己的proxy,而不能统一放store中,即使url一样
        type: 'ajax',
        headers: {
            'Content-Type': 'text/xml;charset=UTF-8'
        },
        reader: {
            type: 'xml',
            root: 'teacherList',//可以不写
            totalProperty: 'teacherTotal',//可以不写
            record: 'teacher'
        }
    },

    hasMany: {
        model: 'AM.model.student',//关联子model
        name: 'hasManyStudent'//对应XML中的实际节点名
    }
});
student model

Ext.define('AM.model.student', {
    extend: 'Ext.data.Model',

    requires: [
        'Ext.data.Field',
        'Ext.data.proxy.Ajax',
        'Ext.data.reader.Xml',
        'Ext.data.association.BelongsTo'
    ],
    uses: [
        'AM.model.teacher'
    ],

    fields: [
        {
            name: 'sex'
        },
        {
            name: 'name'
        }
    ],

    proxy: {  //关联model貌似必须各自定义自己的proxy,而不能放store中
        type: 'ajax',
        headers: {
            'Content-Type': 'text/xml;charset=UTF-8'
        },
        reader: {
            type: 'xml',
            root: 'hasManyStudent',//可以不写
            totalProperty: 'studentTotal',//可以不写
            record: 'student'
        }
    },

    belongsTo: {
        model: 'AM.model.teacher'//关联父model
    }
});

store

Ext.define('AM.store.mystore', {
    extend: 'Ext.data.Store',

    requires: [
        'AM.model.teacher'
    ],

    constructor: function(cfg) {
        var me = this;
        cfg = cfg || {};
        me.callParent([Ext.apply({
            model: 'AM.model.teacher',
            storeId: 'testStore' //必须设storeId
        }, cfg)]);
    }
});


controller

Ext.define('AM.controller.MyController', {
    extend: 'Ext.app.Controller',

    models: [
        'student',
        'teacher'
    ],
    stores: [
        'tstore'
    ],
    views: [
        'MyViewport'
    ],

    onReadClick: function() {
        var me = this;
        var teacherModel = me.getModel('teacher');
        var studentModel = me.getModel('student');
        var userStore = me.getStore('mystore');
        teacherModel.getProxy().url = '/'+GAppID+'/$/callback?callback=IWCallBack1';
        studentModel.getProxy().url = '/'+GAppID+'/$/callback?callback=IWCallBack1';
        userStore.load({
            callback: function (records, operation, success) {
                if (success) {
                    console.log(records);
                    //Ext.MessageBox.alert('成功',records[0].get('name'));
                    Ext.MessageBox.alert('成功',records[0].get('name')+'_'+records[0].get('sex')+'_'+records[0].hasManyStudent().getAt(0).get('name')+'_'+records[0].hasManyStudent().getAt(1).get('name'));
                    //Ext.MessageBox.alert('成功',records[0].student().count());
                }
            }
        });

        //Ext.MessageBox.alert('成功','成功');
    },

    init: function(application) {
        this.control({
            "#read": {
                click: this.onReadClick
            }
        });
    }

});
执行结果



如果XML文件的形式是这样

<?xml version="1.0" encoding="UTF-8"?>
<teacherList>
	<teacherTotal>2</teacherTotal>
	<teacher>
		<name>teacher1</name>
		<sex>F</sex>
		<hasManyStudent>
			<studentTotal>2</studentTotal>
			<name>student1</name> //像这样record属性对应的节点如果没有子节点了 model field 必须要设置mapping属性为 '/'
			<name>student2</name>
		</hasManyStudent>
	</teacher>
	<teacher>
		<name>teacher2</name>
		<sex>M</sex>
		<hasManyStudent>
			<studentTotal>2</studentTotal>
			<name>student3</name>
			<name>student4</name>
		</hasManyStudent>
	</teacher>
</teacherList>

model

Ext.define('AM.model.student', {
    extend: 'Ext.data.Model',

    requires: [
        'Ext.data.Field',
        'Ext.data.proxy.Ajax',
        'Ext.data.reader.Xml',
        'Ext.data.association.BelongsTo'
    ],
    uses: [
        'AM.model.teacher'
    ],

    fields: [
        {
            mapping: '/',  //注意这里要设置mapping属性
            name: 'name'
        }
    ],

    proxy: {
        type: 'ajax',
        headers: {
            'Content-Type': 'text/xml;charset=UTF-8'
        },
        reader: {
            type: 'xml',
            root: 'hasManyStudent',
            totalProperty: 'studentTotal',
            record: 'name'//这是一个没有子节点的record
        }
    },

    belongsTo: {
        model: 'AM.model.teacher'
    }
});







  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值