ExtJS 6:通过创建新的模型实例来加载嵌套数据

时间:2016-07-25 09:54:03

标签: javascript extjs one-to-many has-many extjs6

我尝试创建一个带有hasMany关联的模型,但是当我尝试访问商店时,它是空的。

这是我的模特:

BaseModel:

Ext.define( 'Test.model.schema.BaseModel', {
    extend: 'Ext.data.Model',

    schema: {
        namespace: 'Test.model'
    }
} );

UserModel:

Ext.define('Test.model.user.UserModel', {
    extend: 'Ext.data.Model',

    fields: [
        {
            name: 'displayName',
            type: 'string'
        }
    ],

    hasMany: [
        {
            name: 'roles',
            model: 'user.RoleModel', // also try with Test.model.user.RoleModel
            associationKey: 'roles'
        }
    ]
});

RoleModel:

Ext.define('Test.model.user.RoleModel', {
    extend: 'Ext.data.Model',

    fields: [
        {
            name: 'label',
            type: 'string'
        }
    ]
});

这是我的申请:

Ext.application({
    name: 'Test',

    models : [
        'Test.model.schema.BaseModel',
        'Test.model.user.RoleModel',
        'Test.model.user.UserModel'
    ],

    appFolder : contextPath + '/' + staticsPath + '/js/app',

    controllers : ['router.TestRouterController'],

    defaultToken : 'auth'
});

在我的控制器中,我尝试创建这样的用户模型:

var user = Ext.create('Test.model.user.UserModel', {
    displayName : 'Mick P.',
    roles : [
        {
            label: 'test'
        }
    ]
});

与JSon相同。

当我 user.roles()。getAt(0)时,我得到 null user.roles()。data.items 是空的。

你看到我做错了吗?

编辑1:我的问题的一小部分:https://fiddle.sencha.com/#fiddle/1e54

编辑2:如果我使用内存存储加载数据,它会起作用。但是为什么不直接加载模型呢。

1 个答案:

答案 0 :(得分:2)

Sencha支持向我发送回复。也许有些人需要答案。

首先,您需要阅读此文档页面:http://docs.sencha.com/extjs/6.0.2-classic/Ext.data.reader.Reader.html

当您将数据直接传递给Model构造函数时,它不会通过已配置的阅读器传递,只会评估基本字段。

数据确实需要通过Reader。

如果您不想创建商店:

1 - 您需要将代理声明为模型

2 - 要创建具有嵌套数据的模型,您必须执行以下操作:

UserModel.getProxy().getReader().read(raw);

如果您需要一个小提琴示例告诉我。

- Mickael