5

我有一个 for 循环,我想在其中包含一个模板视图:

表刀片:

#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

座椅刀片:

- 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 和表 ID 的“座位”集合来解决这个问题,但这似乎很愚蠢。我目前正在使用名为“players”的表格的数组属性,每个座位的索引为 0-6……至少,这是我的想法。=)

我还应该提到我将 seat.blade 替换为:

p hi

没有运气,同样的问题。

有任何想法吗?

编辑
版本信息:
Meteorite 版本 0.4.9
Meteor 版本 0.5.9 (git checkout)
Blade 3.0.3

4

1 回答 1

3

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

foreach 区域优于 ... [常规 for 循环] 不仅因为可读性和简洁性,还因为它还为 Blade 提供了更好地与实时页面更新引擎(特别是 Meteor 和 Spark)集成的能力。也就是说,如果实时页面更新引擎支持跟踪响应式集合,则可能会发生最有效的 DOM 操作来就地更新视图的结果,而无需重新渲染整个 Blade 模板。

在您的情况下,由于相同地标的匹配分支,Spark 无法重新呈现您包含的模板。如果你使用foreach,这个问题就解决了。

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

于 2013-03-21T16:43:27.447 回答