2

あなたがうまくやっていることを願っています。

私はextjs4を初めて使用し、関連付けのサンプル例に取り組んでいます。

私は2つの異なるクラスのユーザーと卒業証書を持っています関連して、私は定義しました。

ユーザーhasManyDiplomas、およびDiplomasはUserに属します

私のモデルは以下の通りです

User.js

Ext.define('MyApp.model.User', {
    extend : 'Ext.data.Model',
    idProperty : 'userId',
    fields : [{
        name : 'userId',
        type : 'integer'
    }, {
        name : 'userName',
        type : 'string',

    }],

    hasMany : {
        model : 'MyApp.model.Diploma',
        name : 'diplomas',
    },

});

Diploma.js

Ext.define('MyApp.model.Diploma', {
    extend : 'Ext.data.Model',
    idProperty : 'diplomaId',
    fields : [{
        name : 'diplomaId',
        type : 'integer'
    }, {
        name : 'diplomaName',
        type : 'string',
    }, {
        name : 'userId',
        type : 'integer'
    }],

    associations : [{
        model : 'MyApp.model.User',
        name : 'user',
        type : 'belongsTo'
    }]

});

=====================マイストアは以下のとおりです。======================= =

Diploma.js

Ext.define('MyApp.store.Diploma', {
    extend : 'Ext.data.Store',
    model : 'MyApp.model.Diploma',
    autoLoad : true,

    listeners : {
        'load' : {
            fn : function(store, records, success, operation) {
                console.log('Diplomas are loaded');
            }
        }
    }

});

User.js

  Ext.define('MyApp.store.User', {
        extend : 'Ext.data.Store',
        model : 'MyApp.model.User',
        requires:['Ext.data.proxy.LocalStorage'],
        autoLoad : true,

        listeners : {
            'load' : {
                fn : function(store, records, success, operation) {
                    console.log('User is loaded');
                }
            }
        },

        data : [{
            userId : 1,
            userName : 'Rishabh Shah',
            diplomas:{
                userId : 1,
                diplomaId:1,
                diplomaName:'IT'
            }
        }, {
            userId : 2,
            userName : 'Rakesh Shah',
            diplomas:{
                userId : 2,
                diplomaId:2,
                diplomaName:'CE'
            }
        }, {
            userId : 3,
            userName : 'Rashmin Shah'
        }],

        proxy:{
            type:'memory',
            reader:{
                root:'data'
            }
        }
    });

私はそのようなユーザーから卒業証書を取得することができ、結果を得ることができます

Ext.getStore("User").getAt(0).diplomasStore.getAt(0)

しかし、私が好きなことをしようとすると

Ext.getStrore("Diploma") or Ext.getStrore("Diploma").getAt(0)

何も得られません。アイテムには何も含まれていません...卒業証書からユーザーを取得するにはどうすればよいですか。

そしてもう1つ....卒業証書モデルにプロキシを記述しないと、次のようなエラーが発生します。

Ext.data.proxy.Server.buildUrl():ServerProxyを使用していますが、URLが指定されていません。

案内してください。

ありがとう。


返信ありがとうございます..@john..ユーザーから卒業証書を取得できます..卒業証書からユーザーを取得したかった...自分で試してみました..そして解決策を見つけました...

次のjsonがあります。

[
    {
        "depId": 1,
        "depName": "CE",
        "employees": [
            {
                "empId": 1,
                "firstName": "Rishabh",
                "lastName": "Shah"
            }, {
                "empId": 2,
                "firstName": "Smit",
                "lastName": "Patel"
            }
        ]
    }, {
        "depId": 2,
        "depName": "IT",
        "employees": [
            {
                "empId": 1,
                "firstName": "Parag",
                "lastName": "Raval"
            }, {
                "empId": 2,
                "firstName": "Rakesh",
                "lastName": "Prajapati"
            }
        ]
    }, {
        "depId": 3,
        "depName": "EE",
        "employees": [
            {
                "empId": 1,
                "firstName": "Parag EE",
                "lastName": "Raval EE"
            }, {
                "empId": 2,
                "firstName": "Rakesh EE",
                "lastName": "Prajapati EE"
            }
        ]
    }, {
        "depId": 4,
        "depName": "EC",
        "employees": [
            {
                "empId": 1,
                "firstName": "Parag EC",
                "lastName": "Raval EC"
            }, {
                "empId": 2,
                "firstName": "Rakesh EC",
                "lastName": "Prajapati EC"
            }
        ]
    }, {
        "depId": 5,
        "depName": "Chemial E",
        "employees": [
            {
                "empId": 1,
                "firstName": "Parag",
                "lastName": "Raval"
            }, {
                "empId": 2,
                "firstName": "Rakesh",
                "lastName": "Prajapati"
            }
        ]
    }, {
        "depId": 6,
        "depName": "ME",
        "employees": [
            {
                "empId": 1,
                "firstName": "Parag",
                "lastName": "Raval"
            }, {
                "empId": 2,
                "firstName": "Rakesh",
                "lastName": "Prajapati"
            }
        ]
    }, {
        "depId": 7,
        "depName": "Civil Engineer",
        "employees": [
            {
                "empId": 1,
                "firstName": "Parag",
                "lastName": "Raval"
            }, {
                "empId": 2,
                "firstName": "Rakesh",
                "lastName": "Prajapati"
            }
        ]
    }
]

そして私はmodel.getAssociatedData().user 私の要件に従って使用します

ここで、modelは私の子クラスのレコードであり、userは私の親クラスです。

そして、私は必要とされていない私の卒業証書モデルでプロキシを使用していました....だから、取得していました

Ext.data.proxy.Server.buildUrl():ServerProxyを使用していますが、URLが指定されていません。

上記のエラー。

皆さんありがとう !:)

4

1 に答える 1

3

正確には何が機能していないのですか?たとえば、魔法の方法を使用できましたUser.diplomas()か?@VDPが述べたように、アソシエーション用に作成されたストアはExt.data.Store、親モデル(この場合はユーザー)のデータセットに通常スコープされます。つまり、のUserモデルがある場合、メソッドを呼び出すと、idのがの'のみを含むようにフィルター処理されたものが返されます。1User.diplomas()Ext.data.StoreDiplomauser_id1

これを理解することは非常に重要です!アソシエーションでプロパティを指定しない場合、デフォルトで所有者モデルの小文字の名前に「_id」を加えたものになりforeignKeyhasManyUserます。モデルのhasManyアソシエーションを次のように修正する必要があります。

Ext.define('MyApp.model.User', {
/** Model Definition */
hasMany : {
    model : 'MyApp.model.Diploma',
    name : 'diplomas',
    foreignKey : userId /** This is what you're missing */
}
});

おそらく、このブログ投稿は役に立ちますか?http://extjs-tutorials.blogspot.com/2012/05/extjs-hasmany-relationships-rules.html

ブログ投稿からのいくつかの重要なヒント(リンクがある時点で死んだ場合)

  • *しない非常に正当な理由がない限り、プロキシは常にストアではなくモデルに配置してください。
  • hasManyの関係で使用する場合は、常に子モデルを要求してください。****
  • 子を自由にロードしたい場合は、常にforeignKeyを使用してください
  • 親と同じ応答で子を返す場合は、常にassociationKeyを使用してください
  • 必要に応じて、foreignKeyとassociationKeyの両方を使用できます
  • 常にhasManyの関係に名前を付けます
  • hasMany関係では、常に完全修飾モデル名を使用してください
  • リーダーのルートに意味のある名前(「データ」以外)を付けることを検討してください
  • 子モデルは、hasManyが機能するためにbelongsTo関係を必要としません

*ストアはモデルのプロキシを継承し、いつでもオーバーライドできます

**簡単にし、潜在的な循環参照を回避するために、app.jsでそれらを要求できます

クレジット:Neil McGuigan(http://www.blogger.com/profile/14122981831780837323

于 2013-01-30T18:01:52.070 に答える