Ember计算属性缓慢且不一致

时间:2018-01-31 01:34:03

标签: javascript ember.js

我有一个可以显示视频的应用,并允许用户对视频进行评分。平均评级和视频评分的次数显示在其下方。为了计算这些,我已经为每个模型添加了计算属性。平均属性依赖于总和和长度计算属性。

/*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应用程序。

谢谢!

2 个答案:

答案 0 :(得分:0)

如果没有看到整个架构,很难真正知道哪里可能存在性能问题,但我可以看到以下内容:

  • 您与userrating模型相关联的uservideo模型有关系
  • 您的sumlength计算属性均基于另一个计算值,该值本身执行map以从{{1}中提取rating个值对象
  • 你有另一个计算的观看ratings,这纯粹是确定多个单词" user"代码中的其他地方
  • 最后,你有一个length计算器正在观察其他两个计算属性

现在,再一次,我无法提供确切答案的原因,但这里有一些建议(可能)减轻你的模型加载。

  1. 完全取消avg计算。您可以在组件/控制器端执行此计算,如果您真的想知道是否选择了单个计算,但您可以执行其他操作,例如one
  2. 可以删除
  3. Ember.computed.equal('numRatings', 1)属性,以支持length
  4. this.get('numRatings.length')只关注avg,这样只有在特定数字发生变化时才会重新计算,因为您已经知道numRatings也会更新,所以不妨减少观察到的属性数量
  5. 也就是说,如果它仍然表现得很糟糕,您可能需要确保sum条目中的数据是正确的。如果它仍然感觉很慢或花费时间计算,您也可以尝试将userrating更改为普通的JS mapBy循环,因为它们比使用for要快得多(虽然可读性较差)方法

    祝你好运!

答案 1 :(得分:0)

length: Ember.computed('numRatings',需要length: Ember.computed('numRatings.[]', - 你需要观察数组的长度,而不是数组本身(如果整个值发生变化,它只会引发一个标志) 你也可以使用别名属性 - Ember.computed.alias(' numRatings.length')