我正在尝试使用Meteor构建一个简单的游戏。我有一系列游戏',其中每个游戏都有一个7x7数据阵列用于网格。
我有3个模板,游戏桌,该表的一行和该表的单元格:
<template name="game">
{{#with gameObject}}
{{name}}
<table id="gameGrid">
{{#each state}}
{{> gameRow}}
{{/each}}
</table>
{{/with}}
</template>
<template name="gameRow">
<tr>
{{#each this}}
{{> gameSpace}}
{{/each}}
</tr>
</template>
<template name="gameSpace">
<td class="game-grid-space colour-{{this}}" ></td>
</template>
第一个游戏中的GameObject上下文是我的收藏中的一个游戏 - 它有一个名称和一个7x7数组的状态。
为了处理每个元素的点击事件,我在渲染时为它们分配了一个数据属性,如下所示:
currentSpaceId = 0;
Template.gameSpace.rendered = function(){
if(!this.rendered){
this.$("td").data("spaceId", currentSpaceId);
currentSpaceId++;
this.rendered = true;
}
};
我没有在这里使用会话,因为它似乎没有必要,但我已尝试过它并遇到同样的问题。
这基本上是在它们渲染时从0-48标记49个方格,即按顺序。然后我可以很容易地将其转换为网格位置并识别点击的方块。
问题在于,在任何状态更改时,Meteor似乎重新渲染整个DOM并为每个方块重新调用该渲染方法。这当然意味着他们的数据属性远离重击,因为它只是不断迭代。据我所知,解决方案似乎是我可以以某种方式固定那些数据属性,所以新渲染的dom只是保留它们而不是重写它们。
我真正想做的就是根据状态数组中的值更改每个网格空间上的类(值为r = red,b = blue等,但只是用作CSS类) - 所以如果我和#39;我做的完全是疯了,这也是非常有用的反馈!我真的很难弄清楚如果不是这样的话,我应该如何确定哪些被点击了。
提前感谢您的帮助,如果我能提供任何澄清,我会很高兴。