it-swarm.com.de

Greifen Sie in der Knockout-Ansicht auf $ parent's $ parent zu - verschachteln Sie den Kontext

Der Kürze halber aktualisiert

Wie kann ich in verschachtelten Knockout foreach/with Bindings auf das $ parent der $ -Eltern verweisen?

Beispiel -

    <!-- ko foreach: grandParent -->
        <tr>
            <!-- ko foreach: $parent.parents --> // <-- Doesn't work
                <!-- ko foreach: children -->
                    <td data-bind="if: favToy().name == $parent.$parent.favToy().name">
                        <span data-bind="text: favToy().name"></span>
                    </td>
                <!-- /ko -->
            <!-- /ko -->
        </tr>
    <!-- /ko -->

Original

Entschuldigen Sie die verwirrende Frage, aber ich versuche, den Wert eines Elternteils der zweiten Ebene mit einem Wert im aktuellen Kontext zu vergleichen (siehe unten), um nur einen Bereich anzuzeigen, der dem Wert eines $ Elternteils $ entspricht (ugh!).

    <!-- ko foreach: grandParent -->
        <tr>
            <!-- ko foreach: $parent.parents -->
                <!-- ko foreach: children -->
                    <td data-bind="if: favToy().name == $parent.$parent.favToy().name">
                        <span data-bind="text: favToy().name"></span>
                    </td>
                <!-- /ko -->
            <!-- /ko -->
        </tr>
    <!-- /ko -->

Es wäre einfacher, es so zu machen, aber nach dem, was ich gelesen habe, ist dies nicht möglich oder ich mache es falsch :)

    <!-- ko foreach: grandParent -->
        <tr>
            <!-- ko foreach: $parent.parents -->
                <!-- ko foreach: children ? favToy().name == $parent.$parent.favToy().name -->
                    <td  data-bind="text: favToy().name"></td>
                <!-- /ko -->
            <!-- /ko -->
        </tr>
    <!-- /ko -->

Jede Hilfe wäre sehr dankbar.

74
PW Kad

Verwenden Sie die $parents Array, der Großeltern wäre $parents[1]. Möglicherweise können Sie auch $root wenn das Objekt grandParent in Ihrem Beispiel das oberste übergeordnete Objekt ist.

Aus dem docs :

$ Eltern

Dies ist ein Array, das alle übergeordneten Ansichtsmodelle darstellt:

$ parent [0] ist das Ansichtsmodell aus dem übergeordneten Kontext (d. h. es ist dasselbe wie $ parent).

$ parents [1] ist das Ansichtsmodell aus dem Kontext der Großeltern

$ parents [2] ist das Ansichtsmodell aus dem Urgroßelternkontext

… und so weiter.

$ root

Dies ist das Hauptansichtsmodellobjekt im Stammkontext, d. H. Im obersten übergeordneten Kontext. Es ist normalerweise das Objekt, das an ko.applyBindings übergeben wurde. Dies entspricht $ parents [$ parents.length - 1].

128
Matt Burland

Sie können $parentContext.$parent.

$parentContext bieten viele nützliche Eigenschaften wie ($data, $parent, $index, ...)

7
Hassan Alhaj

Ich denke, es wäre einfacher, die Einstellung noChildContext wie folgt zu verwenden:

Verwenden Sie "as", ohne einen untergeordneten Kontext zu erstellen

Das Standardverhalten der Option as besteht darin, einen Namen für das aktuelle Element hinzuzufügen und gleichzeitig den Inhalt an das Element zu binden. Möglicherweise möchten Sie jedoch den Kontext nicht ändern und nur den Namen des aktuellen Elements festlegen. Dieses letztere Verhalten wird wahrscheinlich in einer zukünftigen Version von Knockout die Standardeinstellung sein. Um es für eine bestimmte Bindung zu aktivieren, setzen Sie die Option noChildContext auf true. Wenn diese Option zusammen mit as verwendet wird, muss der gesamte Zugriff auf die Array-Elemente über den angegebenen Namen erfolgen, und $ data bleibt auf das äußere Ansichtsmodell gesetzt. Beispielsweise:

<ul data-bind="foreach: { data: categories, as: 'category', noChildContext: true }">
    <li>
        <ul data-bind="foreach: { data: category.items, as: 'item', noChildContext: true }">
            <li>
                <span data-bind="text: category.name"></span>:
                <span data-bind="text: item"></span>
            </li>
        </ul>
    </li>
</ul>

Lesen Sie hier mehr

0
cjohansson