2016-09-19 59 views
0

让我们先从一个常见的场景,你必须对模型的计算性能:Emberjs捉住22 - 父计算性质计算的hasMany相关对象

型号/ coney.js

bunniesTotal: Ember.computed.alias('babyBunnies.length') 

比方说入口点的应用程序是显示索引页的所有Coneys

routes/coneys/index 

的API返回所有Coneys但它的分页,所以只有50出现每页(很棒,我们不想太多的兔子跑来跑去吗?)

随着每个康尼(父母的兔子)来所有的孩子(因为只有他们的几个,他们只是littl'uns - 即。小有效载荷!)

因此,bunniesTotal将始终准确,您可以在coneys/index页面上的每个Coney列表上看到它。伟大的,美妙的,你在Ember教程中看到的一个常见例子。 沉闷的善良。

更灰烬善良 - 用户后访问/coneys/new.js,并增加了一个新的Coney和一些BabyBunnies,用户将自动看到上面bunniesTotal更新,当他们回来/coneyes/index,由于新BabyBunny在灰烬 商店 沃伦。水下降,来吧!

现在,让我们前往未来并将我们的 数据 warren缩放。呃哦。

现在Coneys有成千上万的儿童,也许数以千计的孙子太(是啊,兔子,去数字!)

它没有任何意义,现在,在coneys/index页面上,加载所有ALL的BabyBunnies首先击中50个Coneys。不好。因此,我们修改API并删除BabyBunnies,以便每个Coney都必须单独请求它们(例如,例如,当您转到coneys/edit时)。因此,让我们修改API并删除BabyBunnies,以便每个Coney都必须单独请求它们(例如,当您转到coneys/edit时)。

但是......你对计数做了什么?现在客户不知道每个家长可能有多少个孩子。

您可以在API中的每个父代中包含一个属性,而不是在Ember中。所以,现在你计算服务器上的孩子,并将其发送给Ember。也许是meta.children_total或只是模型上的一个属性。嗯不错。

但现在当用户在客户端上添加一个子项时,总数不会自动更新。你已经损失了Ember善良并且你的索引页在用户眼中已经“退化”了。

用户在添加新的“子”并重定向到coneys/index后,将看不到总更新。他们会认为有些事情是错的。发生了什么新的 宝宝兔子 刚刚创建的孩子?

所以,在那个小时间旅行的文章之后,这里是问题。

是否有一些Ember的方式来解决这个Catch-22?

也许在向其添加子项后,父级的后台刷新。或者只是为父母或其他一些Ember魔术请求元数据?

我看过ds-references和发生在该功能上的discussion,但都没有帮助我看到该问题推荐的解决方案是/应该是什么。


UPDATE


在这种DS-引用链接有这样的说法:

检索有关记录或关系

服务器提供的元数据和这个代码:

var meta = post.hasMany('comments').meta(); 
console.log(`${commentIds.length} comments out of ${meta.total}`); 

因此,这意味着答案是有一个由服务器提供的BabyBunnies(儿童)元总。 meta.total将会是所有孩子的总数。

但是,这会导致另外两个问题:

  1. 当用户添加了一个新的婴儿,并将其保存到存储/沃伦和 因此服务器,如何灰烬拿到新的总?它会做一些 背景魔术只检索总数?我怀疑没有,并且 ,我必须手动请求BabyBunny端点刚刚获得 新的总和。

  2. 如果该元总实际上不是一个 '原' 总,但这:

    meta.totalFemaleBabyBunnies

    meta.totalMaleBabyBunnies

我怎么没看到灰烬可以更新此类总数而不会触发BabyBunny终点的刷新(这意味着每次添加新宝贝时都会这样做)

Ha你有这个问题吗?如果是这样,你做了什么来解决它?

回答

0

我解决了这个问题,通过将男性/女性宝宝兔子的总数直接添加到父级的活动记录序列化程序(即,因此它们是父级模型中的Ember中的属性)。没有单独的元总数,也不需要使用ds引用。

我只想看看最简单直接的解决方案是否会“正常工作”。

所以现在当一个新宝贝发布到API中时,会自动重新计算男性/女性计数并将其作为父负载的一部分发送回Ember。 Boom,coney/index页面上的计数更新就像那样!

工程就像一个魅力。

我使用1,500 BabyBunnies(使用Postgres)在本地蹩脚的五岁MacAir(Core i5 1.7GHz/4GB Ram)上测试了它。更新两个计数仅为页面加载增加了大约1ms。因此,1/1/300眼睛:)

的眨眼的我永远不会有1500 BabyBunnies,因此该方案较适合更多。