我有一个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
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
当我第一次加载视图时,一切都很好。但如果我坐下或站着,或去另一张桌子,我明白了:
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 |
我想我可以通过创建一个存储用户ID&amp;的“座位”集合来解决这个问题。表ids,但这看起来很傻。我目前正在使用名为“players”的表的数组属性,每个座位的索引为0-6 ......至少,这就是主意。 =)
我还应该提到我用:
替换了seat.bladep hi
没有运气,同样的问题。
有什么想法吗?
修改
版本信息:
陨石版本0.4.9
流星版本0.5.9(git checkout)
Blade 3.0.3
答案 0 :(得分:3)
这个错误实际上是使用普通的for循环而不是foreach
循环的结果。
foreach区域不仅仅优于... [常规循环] 因为可读性和简洁性,但因为它还提供了Blade 能够更好地与实时页面更新引擎集成 (特别是Meteor和Spark)。也就是说,如果实时页面更新 引擎支持跟踪反应集合,最有效的DOM 可以进行操作以在不更新的情况下就地更新视图的结果 重新渲染整个Blade模板。
在您的情况下,由于匹配相同地标的分支,Spark无法重新渲染您包含的模板。如果您使用foreach
,则会解决此问题。
但是,在某些情况下(如您的情况),foreach
不合适。我认为这里的解决方案是在Blade中创建一个“常规for循环”语法来处理循环。因此,我创建了issue # 157。