meteor blade template在for循环中抛出“同一分支中的第二个地标”异常

时间:2013-03-19 08:13:08

标签: meteor blade meteorite node-blade

我有一个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 &nbsp;

当我第一次加载视图时,一切都很好。但如果我坐下或站着,或去另一张桌子,我明白了:

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.blade
p hi

没有运气,同样的问题。

有什么想法吗?

修改
版本信息:
陨石版本0.4.9
流星版本0.5.9(git checkout)
Blade 3.0.3

1 个答案:

答案 0 :(得分:3)

这个错误实际上是使用普通的for循环而不是foreach循环的结果。

  

foreach区域不仅仅优于... [常规循环]   因为可读性和简洁性,但因为它还提供了Blade   能够更好地与实时页面更新引擎集成   (特别是Meteor和Spark)。也就是说,如果实时页面更新   引擎支持跟踪反应集合,最有效的DOM   可以进行操作以在不更新的情况下就地更新视图的结果   重新渲染整个Blade模板。

在您的情况下,由于匹配相同地标的分支,Spark无法重新渲染您包含的模板。如果您使用foreach,则会解决此问题。

但是,在某些情况下(如您的情况),foreach不合适。我认为这里的解决方案是在Blade中创建一个“常规for循环”语法来处理循环。因此,我创建了issue # 157