4

该应用程序部署在此处:memoryapp.meteor.com 源代码可在此处的 git 存储库中找到:https ://github.com/SnappyCroissant/memoryapp

重置应用程序运行

Cards.update({}, {$set: {state: 'play'}}, {multi: true})

从控制台。

我知道让客户端访问这样的集合是很糟糕的,该应用程序还远未准备好生产我只是通过 Meteor 找到自己的方式。

DOM目前,每当在 Cards 中运行任何更新时,除了那些我称之为持久性的元素之外,整个重绘都会重新绘制。据我所知,元素应该只在更新时重绘,还是我误解了反应性的工作方式?

脚本中唯一真正发生的动态变化是'state'卡片中对象的属性正在发生变化。然而它会重绘每个属性和每个 DOM 元素,除非明确声明不这样做。

是因为它们都在一个数组中传递给模板吗?如果是这样,最好的替代方法是什么。

这个结构有点大杂烩,因为它是一种学习体验,这个问题的所有重要部分(据我所知)都存在于client/memory.jsserver/model.js

4

1 回答 1

5

要获得 的反应式实现#each,您需要将LocalCollection.Cursor对象直接传递给#each. 数组不会做任何特别的事情,并且当任何元素发生更改时,整个数组都将被重做,这就是您所看到的:

换句话说,这应该做你想要的:

   return Cards.find({ deck_id: deck['_id'] }, {sort: {order: 1}})

这会导致额外的重新渲染:

   return Cards.find({ deck_id: deck['_id'] }, {sort: {order: 1}}).fetch();
于 2013-01-13T20:06:42.193 回答