1

コレクションをループするために仮想要素を使用したいのですが、コレクションがビューモデル内に存在する場合に限ります。私の最初の推測は、次のように仮想 foreach が続く場合に仮想を追加することです。

<!-- ko if: items -->
    <!-- ko foreach: items -->
        <span data-bind="text: $data"></span>
    <!-- /ko -->
<!-- /ko -->

指定されたビュー モデルでは、コレクションが存在する場合、ビュー モデルは正しくバインドされます。しかし、何らかの理由で、そうでない場合、KnockoutJS はコレクションが定義されていないという例外をスローします。これは、foreach ステートメントを除外する場合を除いて理にかなっています。コレクションが存在しない場合、if ステートメントは例外として機能し、バインドしません。http://jsfiddle.net/danlister/qhL7e/でより良い例を挙げました。

4

2 に答える 2

4

あなたのフィドルは2つの異なる問題を提供します。

最初の問題

1つ目は、アイテムがobservableArrayであるという事実にあります。あなたがテストするときこの事実のために

<!-- ko if: items -->

observableArrayは単なる関数呼び出しであるため、常にtrueを返します。この問題を修正するには、配列が空であるかどうかを確認できます。これは、items配列が常に存在することがわかっているためです。

<!-- ko if: items().length !== 0 -->

2番目の問題

2番目の問題(フィドルのnoitems配列を参照する)は、私の知る限りでは実行できません。これは、バインディングを最初にページに適用するときに、すべてのifステートメントを計算し、監視可能な変数の1つが変更された場合にのみそれらを更新するという事実によるものです。アレイは作成時に存在しなかったため、再評価されることはありません。


両方のケースを紹介するフィドルを作成しました:http://jsfiddle.net/Rynan/3UMTM/。最初の問題で配列内のすべての要素を削除すると「test」が消え、テキストが更新されてもnoitemsブール値を切り替えると「Taa-daa」が表示されないことに注意してください。

于 2012-09-07T16:02:11.027 に答える
0

問題はこれにあります...

<!-- ko if: noitems -->
    <!-- ko foreach: noitems -->
        <span data-bind="text: $data"></span>
    <!-- /ko -->
<!-- /ko -->

noitemsビュー モデルでメンバーを定義する必要があります。

編集

あなたはおそらくそれを回避するためにこのようなことをすることができます-私は試していません.

<!-- ko if: noitems -->
    <!-- ko foreach: noitems && noitems() -->
        <span data-bind="text: $data"></span>
    <!-- /ko -->
<!-- /ko -->
于 2012-09-07T08:42:20.463 に答える