簡體   English   中英

灰燼計算的屬性緩慢且不一致

[英]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 userratinguser模型有關系
  • 您的sumlength計算屬性都基於另一個計算值,另一個計算值本身正在執行map以將rating值從ratings對象中拉出
  • 您還有另一個計算出的觀看length ,它純粹是確定代碼中其他位置的“用戶”一詞的復數形式
  • 最后,您有一個avg計算的avg ,它也在監視其他兩個已計算的屬性

現在,我仍然不能真正提供一個確切的答案,但是這里有一些建議可以減輕(也許)減輕您的模型負擔。

  1. 完全消除one計算。 如果您確實想知道是否選擇了一個,則可以在組件/控制器端執行此計算,但是可以執行其他操作,例如Ember.computed.equal('numRatings', 1)
  2. 可以通過使用this.get('numRatings.length')來消除length屬性
  3. avgnumRatings以便僅在該特定數字更改時才重新計算,因為您已經知道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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM