我有一个可以显示视频的应用,并允许用户对视频进行评分。平均评级和视频评分的次数显示在其下方。为了计算这些,我已经为每个模型添加了计算属性。平均属性依赖于总和和长度计算属性。
/*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应用程序。
谢谢!
答案 0 :(得分:0)
如果没有看到整个架构,很难真正知道哪里可能存在性能问题,但我可以看到以下内容:
userrating
模型相关联的user
和video
模型有关系sum
和length
计算属性均基于另一个计算值,该值本身执行map
以从{{1}中提取rating
个值对象ratings
,这纯粹是确定多个单词" user"代码中的其他地方length
计算器正在观察其他两个计算属性现在,再一次,我无法提供确切答案的原因,但这里有一些建议(可能)减轻你的模型加载。
avg
计算。您可以在组件/控制器端执行此计算,如果您真的想知道是否选择了单个计算,但您可以执行其他操作,例如one
Ember.computed.equal('numRatings', 1)
属性,以支持length
this.get('numRatings.length')
只关注avg
,这样只有在特定数字发生变化时才会重新计算,因为您已经知道numRatings
也会更新,所以不妨减少观察到的属性数量也就是说,如果它仍然表现得很糟糕,您可能需要确保sum
条目中的数据是正确的。如果它仍然感觉很慢或花费时间计算,您也可以尝试将userrating
更改为普通的JS mapBy
循环,因为它们比使用for
要快得多(虽然可读性较差)方法
答案 1 :(得分:0)
length: Ember.computed('numRatings',
需要length: Ember.computed('numRatings.[]',
- 你需要观察数组的长度,而不是数组本身(如果整个值发生变化,它只会引发一个标志)
你也可以使用别名属性 - Ember.computed.alias(' numRatings.length')