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を格納する「席」コレクションを作成することでこれを修正できると思いますが、それはばかげているようです。私は現在、「プレーヤー」と呼ばれるテーブルの配列プロパティを使用しています。各座席のインデックスは0〜6です...少なくとも、それがアイデアです。=)

また、seat.bladeを次のものに置き換えたことにも言及する必要があります。

p hi

運が悪い、同じ問題。

何か案は?

バージョン情報の編集
:
Meteorite バージョン 0.4.9
Meteor バージョン 0.5.9 (git チェックアウト)
Blade 3.0.3

4

1 に答える 1

3

このバグは、実際にはループの代わりに昔ながらのforループを使用した結果ですforeach

foreach領域は、読みやすさと簡潔さのためだけでなく、ライブページ更新エンジン(特にMeteorとSpark)とより適切に統合する機能をBladeに提供するため、...[通常のforループ]よりも優先されます。つまり、ライブページ更新エンジンがリアクティブコレクションの追跡をサポートしている場合、Bladeテンプレート全体を再レンダリングせずに、ビューの結果をインプレースで更新するために最も効率的なDOM操作が発生する可能性があります。

あなたの場合、同じランドマークのブランチが一致しているため、Sparkは含まれているテンプレートの再レンダリングに失敗しています。を使用するforeachと、この問題は解決されます。

ただし、状況によっては(あなたのような)、foreach適切ではありません。ここでの解決策は、Blade内に「通常のforループ」構文を作成してループを処理することだと思います。このため、私は第157号を作成しました。

于 2013-03-21T16:43:27.447 に答える