0

我尝试构建一个非常简单的应用程序,该应用程序基于两个关联模型创建一个商店。(它基于您可以在此处找到的示例。)如果我使用 Shore 类名称,这将有效。但是,一旦我像以前那样使用带有路径和应用程序名称的类名,它就不再起作用了。

我做了以下更改:

  • 将“Pessoa”更改为“Aap.model.Pessoa”
  • 将“Endereco”更改为“Aap.model.Endereco”

有人可以向我解释一下:

  1. 根本问题是什么?
  2. 为了使关联在第二个示例中起作用,我必须进行哪些更改

有效的例子

应用程序.js:

Ext.Loader.setConfig({
    enabled: true, // Allows dynamc loading of JavaSCript files
    disableCaching: false // Disable random parameter in the URLs path}); 

Ext.application({
    name: 'Aap',
    models: ['Pessoa', 'Endereco']});

应用程序/模型/Pessoa.js:

Ext.define('Pessoa', {
extend: 'Ext.data.Model',
fields: [
        {name: 'id', type: 'int'},
        {name: 'nome', type: 'string'}
],
proxy: {
    type: 'rest',
    url: 'data/data',
    format: 'json'
},  
          hasOne: {model: 'Endereco', foreignKey: 'pessoaId'} }

应用程序/模型/Endereco.js:

Ext.define('Endereco', {
extend: 'Ext.data.Model',
fields: [
    {name: 'id', type: 'int'},
    {name: 'logradouro', type: 'string'}
]});

数据/数据.json:

[
{
    "id": 1,
    "nome": "Loiane",
    "sobrenome": "Groner",
    "endereco": {
        "id": 14,
        "logradouro": "rua ficticia",
        "numero": "100"
    }
},
{
    "id": 2,
    "nome": "Tom",
    "sobrenome": "Stock",
    "endereco": {
        "id": 34,
        "logradouro": "reality street",
        "numero": "55"
    }
}]

浏览器控制台中的命令:

   pessoaStore = new Ext.data.Store({
    autoLoad: true,
model: 'Pessoa'
});

结果,我得到了一个带有两个正确关联模型的商店。但是,如果我更改类名,则关联不再起作用。


不起作用的例子

应用程序.js:

Ext.Loader.setConfig({
    enabled: true, // Allows dynamc loading of JavaSCript files
    disableCaching: false // Disable random parameter in the URLs path}); 

Ext.application({
    name: 'Aap',
    models: ['Aap.model.Pessoa', 'Aap.model.Endereco']});

应用程序/模型/Pessoa.js:

Ext.define('Aap.model.Pessoa', {
extend: 'Ext.data.Model',
fields: [
        {name: 'id', type: 'int'},
        {name: 'nome', type: 'string'}
],
proxy: {
    type: 'rest',
    url: 'data/data',
    format: 'json'
},  
          hasOne: {model: 'Aap.model.Endereco', foreignKey: 'pessoaId'} }

应用程序/模型/Endereco.js:

Ext.define('Aap.model.Endereco', {
extend: 'Ext.data.Model',
fields: [
    {name: 'id', type: 'int'},
    {name: 'logradouro', type: 'string'}
]});

数据/数据.json:

[
{
    "id": 1,
    "nome": "Loiane",
    "sobrenome": "Groner",
    "endereco": {
        "id": 14,
        "logradouro": "rua ficticia",
        "numero": "100"
    }
},
{
    "id": 2,
    "nome": "Tom",
    "sobrenome": "Stock",
    "endereco": {
        "id": 34,
        "logradouro": "reality street",
        "numero": "55"
    }
}]

浏览器控制台中的命令:

pessoaStore = new Ext.data.Store({
    autoLoad: true,
    model: 'Aap.model.Pessoa'
});

结果,在这里我得到了带有“Pessoa”模型数据的商店,但“Endereco”模型没有关联,我无法获得相应的数据。

任何帮助表示赞赏!

4

1 回答 1

0

我解决了这个问题:

在“app/model/Pessoa.js 文件”中,我只需要替换

hasOne: {model: 'Endereco', foreignKey: 'pessoaId'}

hasOne: {model: 'Aap.model.Endereco', associationKey: 'endereco', foreignKey: 'pessoaId'}

现在,协会工作正常。

AssociationKey的问题,它是从中读取关联的属性。正如ExtJS 文档中所解释的,associationKey 默认是关联的 moel 的名称。

在第一个示例(有效的示例)中,效果很好。关联键对应模型名称“ Endereco ”,默认设置为“ endereco ” 。

但是,在第二个示例(不起作用的示例)中,默认的 associationKey 没有在数据 (app/model/Pessoa.js) 中找到任何具有相同名称的属性。AssociationKey 对应模型名称“ Aap.model.Endereco ”,默认设置为“ aap.model.endereco ”。

因此,为了解决问题,必须将关联密钥明确定义为“ endereco ”。

于 2013-09-06T09:38:30.287 回答