2

Sencha Touch 2 を使用しており、次のようなモデルを定義しています。

Ext.define('csx.model.Profile', {
 extend: 'Ext.data.Model',

 config: {
    fields: [
        {name: 'firstname',type: 'string'},
        {name: 'lastname', type: 'string'},
    ],

    hasMany: [
        {model: 'Telephone', name: 'telephones'},
        {model: 'Email', name: 'emails'},
    ],
 },

 doSomething: function () {
    var firstname = this.get('firstname'); //returns null
    var phones = this.telephones(); // throws a TypeError
},

});

関数内doSomethingで、モデルの値とプロパティに関連付けられたモデルにアクセスしようとしていhasManyます。get関数は null を返すだけで、関連付けられたモデルにアクセスしようとすると、オブジェクトに電話機能がないことを示す TypeError しか返されません。しかし、Sencha Touch 2 ガイドのUsingModelsでモデルの使用方法を見ると、hasMany指定した名前 (電話) に似た関数を介して関連付けにアクセスできると書かれています。

では、代わりにモデル内のフィールド値と関連モデルにアクセスするにはどうすればよいでしょうか?

4

1 に答える 1

2

モデルの完全な名前を反映するように、モデルの「hasMany」構成のモデル プロパティを変更する必要があります。

hasMany: [
    {model: 'csx.model.Telephone', name: 'telephones'},
    {model: 'csx.model.Email', name: 'emails'},
],

つまり、モデル Telephone と Email を次のように定義したとします。

Ext.define('csx.model.Telephone', { 
    extend: 'Ext.data.Model',
    config: {
        fields: [
            {name: 'number', type: 'string'},
        ],
 });

Ext.define('csx.model.Email', { 
    extend: 'Ext.data.Model',
    config: {
        fields: [
            {name: 'address', type: 'string'},
        ],
 });

次に、「プロファイル」モデルのインスタンスを作成する場合:

var profile = Ext.create('csx.model.Profile', {firstname:'John',lastname:'Deere'});

次のようにフィールドにアクセスできます。

profile.get('firstname');
profile.get('lastname');

hasMany アソシエーションの「telephones」ストアと「emails」ストアは次のようになります。

profile.telephones()
profile.emails()

「firstname」フィールドに null 値があったという事実は、モデルをインスタンス化していないためです。ドキュメントに記載されているように「telephones()」関数が自動的に作成されなかったという事実は、この回答の冒頭で説明したように「モデル」構成が間違っているためです。

お役に立てれば。

于 2012-05-11T17:33:24.690 に答える