我是Ember.js的新手,在嘗試創建數千條記錄(5300時遇到性能問題)更新hasMany關係。在創建新記錄之前,我正在向我的API請求檢索記錄。在承諾返回後,我然後對每個記錄(5300)做一個forEach來對新記錄集進行計算。創建記錄本身大約需要2秒鐘。更新hasMany只會在前40條記錄中快速啓動,然後每秒更新一次。Ember.js/Ember Data創建數千個子記錄後需要花費幾分鐘的時間來更新hasMany父項
我還應該注意到這是在組件內完成的。我知道這通常是anit模式,但在這種情況下,沒有理由更改URL或轉換。這是一個屏幕,用戶可以從物品池中選擇(由路線提供),應用定價規則,然後根據這些物品創建一個事件(在路線中創建)。確定哪些項目將成爲活動的一部分是一個沙箱。一旦用戶決定了他們的事件,然後我發送一個行動到路線來執行實際保存並堅持到我的後端。除了反模式方面,我看不到這會如何影響hasMany更新的性能。
我正在使用RESTAdapter和RESTSerializer它的價值,但這應該不會有任何影響,因爲我只是處理Ember數據存儲。
灰燼版本:
Ember : 2.5.1
Ember Data : 2.5.3
jQuery : 2.2.3
Ember Simple Auth : 1.1.0
這兩種型號的問題如下...
子模型(事件項):
export default DS.Model.extend({
event: DS.belongsTo('event'),
itemNumber: DS.attr('string'),
styleNumber: DS.attr('string'),
tier: DS.attr('string'),
eventPrice: DS.attr('number')
});
父模型(事件):
export default DS.Model.extend({
eventTypeId: DS.attr('string'),
eventName: DS.attr('string'),
eventDesc: DS.attr('string'),
startDate: DS.attr('moment-date'),
endDate: DS.attr('moment-date'),
priority: DS.attr('number'),
statusCode: DS.attr('string'),
value: DS.attr('number'),
eventItems: DS.hasMany('event-item', {async:true})
});
事件創造紀錄:在組件負責創建記錄和更新的hasMany
model() {
return this.store.createRecord('event', {});
},
代碼塊:
this.get('store').query('pricing', {brandCd: '00'}).then(tiers => {
tiers.forEach(tier => {
this.get('event').get('eventItems').createRecord({
styleNumber: tier.get('styleNumber'),
itemNumber: tier.get('itemNumber'),
brandCd: '00',
tier: tier.get('tier'),
eventPrice: this._calculateEventPrice(tier.get('origPrice'), this.get('event').get('eventTypeId'), this.get('event').get('value')),
});
});
this.get('event').set('needsUpdated', 'Y');
});
到目前爲止,我已經嘗試了以下...
- 添加逆關係到我的hasMany和belongsTo
- 將所有創建記錄添加到
Ember.A()
,然後嘗試推新記錄到hasMany像這樣:this.get('event').get('eventItems').pushObjects(newEventItems);
。也嘗試過使用this.get('event').get('eventItems').addObjects(newEventItems);
。 - 在正在創建的記錄上設置belongsTo而不是更新父項(事件)的hasMany。
- 我也繼續前進,並將此邏輯轉移到我的路線中,以確保在組件中不會出現奇怪的行爲。它執行相同的操作。
我會假設(如果我錯了,請糾正我)在客戶端嚴格創建記錄和更新關係應該能夠處理數千條記錄,而不會出現太多問題。我希望我只是在做一些不正確或者效率低下的事情,這對於有更多經驗的人來說是顯而易見的。任何幫助,包括替代品,非常感謝!
你在測試什麼瀏覽器? – Terseus
@Terseus,Chrome,Version 49.0.2623.75 m –