KnockoutJS: Verwenden von geschachtelten bedingten Anweisungen if für virtuelle Elemente
Ich bin zu wollen Einsatz virtueller Elemente, um eine Schleife durch eine Sammlung aber nur, wenn die Sammlung besteht innerhalb der view-Modell. Meine ursprüngliche Vermutung wäre so fügen Sie einer virtuellen, wenn darauf eine virtuelle foreach-wie folgt:
<!-- ko if: items -->
<!-- ko foreach: items -->
<span data-bind="text: $data"></span>
<!-- /ko -->
<!-- /ko -->
Mit der angegebenen view-Modell, meiner Ansicht Modell richtig bindet, wenn die Sammlung existiert. Aber aus irgendeinem Grund, wenn es nicht, KnockoutJS wirft eine Ausnahme, die sagen, dass meine Sammlung ist nicht definiert. Dies macht Sinn, außer wenn ich die foreach-Anweisung aus. Die if-Anweisung arbeitet dann als vorbehalten und nicht bindet, wenn die Sammlung nicht vorhanden. Ich habe da ein besseres Beispiel an http://jsfiddle.net/danlister/qhL7e/.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Liegt das problem mit diesem...
Müssen Sie definieren eine
noitems
Mitglied in Ihrer view-Modell.BEARBEITEN
Könnte Sie wahrscheinlich so etwas wie dies zu umgehen - ich habe es nicht ausprobiert.
noitems
Eigenschaft der foreach. die if-Anweisung ist eine Reine UI-Bedingung, die sagt, "wenn es einen noitems Eigenschaft, die nicht null oder undefined, dann fügen Sie das markup auf den DOM"Ihre Geige bietet zwei verschiedene Probleme.
Erste Problem
Der erste liegt mit der Tatsache, dass Elemente ist ein observableArray. Aufgrund dieser Tatsache, wenn Sie test auf
es wird immer true zurückgeben, da eine observableArray ist einfach eine Funktion aufrufen. Um dieses problem zu beheben, könnten Sie prüfen, ob das array leer ist, weil Sie wissen, das items-array wird immer da sein, wie
Zweite Problem
Das zweite Problem (Verweis auf die noitems array in Ihrem fiddle) nicht gemacht werden können, soweit reicht mein wissen. Dies ist aufgrund der Tatsache, dass bei der Anwendung der Bindungen das erste mal auf die Seite, es berechnet alle if-Anweisungen und wird nur aktualisiert, wenn Sie eine der beobachtbaren Variablen ändert. Da das array nicht da war bei der Schöpfung, es wird nie neu bewertet werden.
Habe ich eine Geige präsentieren die beiden Fälle: http://jsfiddle.net/Rynan/3UMTM/. Beachten Sie, wie "test" geht Weg, wenn Sie entfernen Sie alle Elemente im array für das erste problem und wie "Taa-daa" nie wird angezeigt, wenn Sie den Parameter boolean noitems obwohl die text-updates.