2012-12-15 46 views
1

自動填充一個模型屬性我使用ExtJS的4.1.0ExtJS的通過關聯

說我有幾個簡單的模型通過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.. */ 

}); 

現在,如果我想我的App.model.Ordercontents屬性時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,但無論如何,即使我對關聯數據的異步請求執行回調,我也無法訪問由關聯加載的數據。

最終,我希望能夠從我的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每個實例;這似乎應該很容易完成。我錯過了什麼?!

謝謝你的時間!

回答

0

我通過重載的構造管理的解決方法這將有助於某人:)

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.. */ 

}); 

更新: 你可以寫你自己的負載方法(在本例中這被稱作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/

+0

我不相信模型的火'負載'事件? http://docs.sencha.com/ext-js/4-1/#!/api/Ext.data。模型 –

+0

我已經更新了我的答案。看看它。 – lontivero

+0

對不起@lontivero的反應遲鈍,這看起來像一個優雅的解決方案。爲了我的需要,我重載了包含我的訂單的商店的構造函數。該方法遍歷每個加載的記錄並調用我的'loadContents'方法,然後依次填充對象的「contents」屬性。反過來,每當我從訂單的商店檢索訂單時,它都會加載其內容。再次感謝您的寶貴意見和解決方案! –

1

你提到你試過構造器但我認爲你做錯了什麼。如果你的構造是這樣的:

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); 
    } 
}); 

希望:

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

我認爲你會得到想要的結果......

+0

我或多或少地嘗試了這種方法。嘗試調用loadContents時,出現錯誤「無法調用未定義的方法」調用。我已經管理了一個解決方法,請參閱我的下面的評論。我重載了_store_構造函數。 –