[英]Ember Computed Property Slow and Inconsistent
我有一個顯示視頻並允許用戶對視頻進行評分的應用。 視頻下方會顯示平均評分和對視頻進行評分的次數。 為了計算這些,我向每個模型添加了計算屬性。 平均屬性依賴於求和和長度計算的屬性。
/*global Ember */
import DS from 'ember-data';
export default DS.Model.extend({
title: DS.attr('string'),
url: DS.attr('string'),
ratings: DS.hasMany('userrating'),
users: DS.hasMany('user'),
rated: DS.attr('boolean'),
// maps through ratings objects and pulls out the rating property
// returns an array of integers that represent all of one videos ratings
numRatings: Ember.computed.mapBy('ratings', 'rating'),
// returns the sum of a videos ratings
sum: Ember.computed.sum('numRatings'),
// returns the number of ratings a video has
length: Ember.computed('numRatings', function () {
return this.get('numRatings').length;
}),
// returns true if the video has only been rated once
// this is used to determine if '1 user' or '2 users' etc.
// should be displayed
one: Ember.computed('length', function () {
if (this.get('length') === 1) {
return true;
}
}),
// returns the average rating of a video
avg: Ember.computed('length', 'sum', function () {
return Math.round(this.get('sum') / this.get('length'));
})
});
我注意到有時會顯示總和而不是平均值。 這通常只發生一秒鍾,然后平均值會正確顯示,但偶爾會不顯示平均值。 今天,除一個視頻外,所有視頻均正確顯示,但其中一個視頻的平均評分為“ 33/5”。
為什么會這樣呢? 我是否應該構建Ember計算的屬性以相互依賴? 這僅僅是瀏覽器運行緩慢的問題嗎? 我正在加載一堆視頻和圖像。
總的來說,我對Web開發還很陌生,這是我的第一個Ember應用。
謝謝!
在不了解整個體系結構的情況下很難真正知道哪里可能存在性能問題,但是我可以看到以下內容:
video
模型相關聯的user
userrating
和user
模型有關系 sum
和length
計算屬性都基於另一個計算值,另一個計算值本身正在執行map
以將rating
值從ratings
對象中拉出 length
,它純粹是確定代碼中其他位置的“用戶”一詞的復數形式 avg
計算的avg
,它也在監視其他兩個已計算的屬性 現在,我仍然不能真正提供一個確切的答案,但是這里有一些建議可以減輕(也許)減輕您的模型負擔。
one
計算。 如果您確實想知道是否選擇了一個,則可以在組件/控制器端執行此計算,但是可以執行其他操作,例如Ember.computed.equal('numRatings', 1)
this.get('numRatings.length')
來消除length
屬性 avg
只numRatings
以便僅在該特定數字更改時才重新計算,因為您已經知道sum
也會更新,因此也可能會減少觀察到的屬性的數量 就是說,如果它仍然表現不佳,則可能要確保在用戶userrating
條目中找到的數據正確。 如果仍然感到緩慢或需要花費時間,還可以嘗試將mapBy
更改為普通的JS for
loop循環,因為它們比使用Array
方法要快得多(盡管可讀性較差)。
祝好運!
length: Ember.computed('numRatings',
需要是length: Ember.computed('numRatings.[]',
--您需要觀察數組的長度,而不是數組本身的長度(僅在出現以下情況時才會引發標志)值整體上會發生變化),您也可以使用alias屬性-Ember.computed.alias('numRatings.length')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.