0

関連付けられた 2 つのモデルに基づいてストアを作成する、非常に単純なアプリケーションを構築しようとしました。(これは、ここで見つけることができる例に基づいています。) これは、ショア クラス名を使用する場合に機能します。ただし、以前のように、パスとアプリケーション名でクラス名を使用するとすぐに機能しなくなります。

次の変更を加えました。

  • 「ペソア」を「Aap.model.Pessoa」に変更
  • 「エンデレコ」を「Aap.model.エンデレコ」に変更

誰かが私に説明してもらえますか:

  1. 根本的な問題は何ですか?
  2. 2 番目の例で関連付けを機能させるには、何を変更する必要がありますか?

うまくいく例

app.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'}
]});

データ/data.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'
});

その結果、適切に関連付けられた 2 つのモデルを持つストアが得られます。ただし、クラス名を変更すると、関連付けが機能しなくなります。


うまくいかない例

app.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'}
]});

データ/data.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 dcumentationで説明されているように、associationKey はデフォルトで関連付けられた moel の名前です。

最初の例(うまくいった例) では、これはうまくいきました。associationKey は、デフォルトで「 endereco 」に設定されているモデル名「Endereco 」に対応していました。

ただし、2 番目の例(機能しなかった例) では、デフォルトの associationKey によって、データ (app/model/Pessoa.js) 内に同じ名前のプロパティが見つかりませんでした。associationKey は、デフォルトで「 aap.model.endereco 」に設定されたモデル名「Aap.model.Endereco 」に対応していました。

したがって、この問題を解決するには、 associationKey を「 endereco 」として明示的に定義する必要がありました。

于 2013-09-06T09:38:30.287 に答える