Tho*_*ter 5 meteor blade node-blade meteorite
我有一个for循环,我想在其中包含一个模板视图:
table.blade:
#game
h1= table.name
-if( table.playerSitting() )
a.btn.btn-danger.stand(href="#") Stand
#table
-for (var i=0; i<7;i++)
include 'seat' exposing i
Run Code Online (Sandbox Code Playgroud)
seat.blade:
- id = 'p' + (i+1)
div(id="#{id}")
-if (table.hasAt(i))
p= table.usernameAt(i)
-else
-if( !table.playerSitting() )
a.btn.btn-inverse.sit(href="#", data-key="#{i}") Sit
-else
p
Run Code Online (Sandbox Code Playgroud)
当我第一次加载视图时,一切都很好.但如果我坐下或站着,或去另一张桌子,我会得到这个:
Exception from Deps recompute: Error: Can't create second landmark in same branch
at /home/thomporter/meteor/blackjack/views/table.blade:8:4
6 | #table
7 | -for (var i=0; i<7;i++)
8 > include 'seat' exposing i
9 |
10 |
Run Code Online (Sandbox Code Playgroud)
我想我可以通过创建一个存储用户ID和表ID的"席位"集合来解决这个问题,但这看起来很愚蠢.我目前正在使用名为"players"的表的数组属性,每个座位的索引为0-6 ......至少,这就是主意.=)
我还应该提到我用以下内容替换了seat.blade:
p hi
Run Code Online (Sandbox Code Playgroud)
没有运气,同样的问题.
有任何想法吗?
编辑
版本信息:
陨石版0.4.9
流星版0.5.9(git checkout)
刀片3.0.3
这个错误实际上是使用普通的 for 循环而不是foreach循环的结果。
foreach 区域优于 ... [常规 for 循环],不仅是因为可读性和简洁性,还因为它还为 Blade 提供了更好地与实时页面更新引擎(特别是 Meteor 和 Spark)集成的能力。也就是说,如果实时页面更新引擎支持跟踪反应式集合,则可能会发生最有效的 DOM 操作来就地更新视图的结果,而无需重新渲染整个 Blade 模板。
在您的情况下,Spark 由于同一地标的匹配分支而无法重新渲染您包含的模板。如果使用foreach,这个问题就可以解决。
然而,在某些情况下(比如你的情况),foreach这是不合适的。我认为这里的解决方案是在 Blade 中创建一个“常规 for 循环”语法来处理循环。因此,我创建了问题#157。