1

ExtJS4.1.0を使用しています

hasManyアソシエーションを介して接続されたいくつかの単純なモデルがあるとします。モデルは注文と注文内容を表します...

Ext.define('App.model.Order', 
{
    extend: 'Ext.data.Model',
    fields: ['id', 'order_date', 'order_total', 'contents' ],
    associations: [{
            type           : 'hasMany',
            model          : 'App.model.OrderContents',
            name           : 'getContents', /** magic method */
            primaryKey     : 'id',
            foreignKey     : 'order_id',
            autoLoad       : false
    }],

    /** Proxy Definition here.. */

});

Ext.define('App.model.OrderContents', 
{
    extend: 'Ext.data.Model',
    fields: ['id', 'order_id', 'item_id' ],

    /** Proxy Definition here.. */

});

モデルがインスタンス化されたときcontentsに自分のプロパティをApp.model.Order自動的に設定したい場合はどうすればよいですか?Order一時的な解決策として、Orderモデルに次のメソッドを追加しました。

Ext.define('App.model.Order', 
{

/** Model definition ... */

    loadContents: function()
    {
       this.getContents().load({
            callback: function()
            {
                this.set('contents', arguments[0]);
            },
            scope: this
        });

    }
});

Orderコンテンツをすぐに利用できるオブジェクトを作成するには、次のことを行う必要があります。

var myOrder = new App.model.Order({id:1, order_date:'12-15-2012', order_total:100});
myOrder.getData(true); // contents will be null
myOrder.loadContents();
myOrder.getData(); // contents will be an array of OrderContents

コンストラクターをオーバーロードしようとしましApp.model.Orderたが、アソシエーションデータの非同期リクエストでコールバックを実行しても、アソシエーションによってロードされたデータにアクセスできません。

最終的には、自分からOrderを取得しApp.store.Orders、取得したレコードにすでにcontentsプロパティが設定されているようにしたいのですが、理解できません。次のようにストアからレコードを取得した場合:

myStore = Ext.getStore('OrderStore');
myOrder = myStore.findRecord('id',1);
myOrder.getData(); // contents will be null
myOrder.loadContents();
myOrder.getData(); // contents will be an array of OrderContents

私は本当に、アプリケーション全体.loadContents()のすべてのインスタンスで必要になることを削減しようとしています。App.model.Orderこれは非常に簡単に実行できるはずです。何が足りないの?

御時間ありがとうございます!

4

3 に答える 3

1

これはテストされていませんが、動作するはずです。

Ext.define('App.model.Order', 
{
    extend: 'Ext.data.Model',
    fields: ['id', 'order_date', 'order_total', 'contents' ],
    associations: [{
            type           : 'hasMany',
            model          : 'App.model.OrderContents',
            name           : 'getContents', /** magic method */
            primaryKey     : 'id',
            foreignKey     : 'order_id',
            autoLoad       : false
    }],
    load: function(id, config) {
            config = Ext.apply({
                  success: function(record, operation) {
                        store.getContents().load();
                  },
            }, config);
            this.callParent([id, config]);
    },
    /** Proxy Definition here.. */

});

更新:次 のように独自のloadメソッド(この例ではloadAllと呼ばれます)を作成できます。

    Ext.define('App.model.OrderContents', 
    {
         extend: 'Ext.data.Model',
         fields: ['id', 'order_id', 'item_id' ],

         proxy: {
                type: 'memory',
                data: [
                    {id: 1, order_id: 1, item_id: 2}, 
                    {id: 2, order_id: 1, item_id: 3},
                    {id: 3, order_id: 21, item_id: 3}
                ],
              reader: 'json'            
         }

    });


    Ext.define('App.model.Order', 
         {
              extend: 'Ext.data.Model',
              fields: ['id', 'order_date', 'order_total', 'contents' ],
              associations: [{
                         type           : 'hasMany',
                         model          : 'App.model.OrderContents',
                         name           : 'getContents', /** magic method */
                         primaryKey     : 'id',
                         foreignKey     : 'order_id',
                         autoLoad       : false
              }],
              statics: {
                      loadAll: function(id, config) {
                         config = Ext.apply({
                                 callback: function(record, operation) {
                                     if(operation.wasSuccessful()){
                                        record.getContents().load();
                                        record.set('contents', record.getContents().getRange());
                                         }
                               },
                                scope: this
                         }, config);
                         App.model.Order.load(id, config);
                    }
              },
              proxy: {
                    type: 'memory',
                    data: {'id':1, 'order_date':null, 'order_total': 100, 'contents':[]},
                    reader: {
                        type: 'json'
                    }

              }
         });


var order;
App.model.Order.loadAll(1,{
    success: function(record){
        order = record;
    }
    });

console.log(order);

jsfiddleで動作していることがわかります:

http://jsfiddle.net/lontivero/X4gfR/

于 2012-12-15T19:07:41.903 に答える
1

建設業者と一緒にやってみたとおっしゃっていましたが、何か間違ったことをしたと思います。コンストラクターが次のようになっている場合:

constructor: function(){
    var me = this;
    me.callParent([arguments]);
    me.loadContents();
}

私はあなたが望ましい結果を得ると思います...

于 2012-12-15T19:32:37.337 に答える
0

ストアのコンストラクターをオーバーロードすることで回避策を管理しました。

Ext.define('App.store.Orders', {
    extend: 'Ext.data.Store',
    storeId: 'OrdersStore',
    model: 'App.model.Order',

    constructor: function()
    {
        this.superclass.constructor.call(this);
        this.on('load', function(store, records, success, eOpts){
            Ext.each(records, function(order){
               order.loadContents();
            });
        }, this);
    }
});

うまくいけば、これは誰かを助けるでしょう:)

于 2012-12-15T20:11:23.847 に答える