Ich versuche, einen div-Abschnitt basierend auf den entsprechenden Schaltflächen, die durch foreach-Schleife erstellt werden, zu zeigen und auszublenden. Im Moment, wenn ich auf die Schaltfläche klicke, werden alle div-Abschnitte angezeigt und nicht die, unter der sich die Schaltfläche befindet. Ich bin ziemlich neu im Knockout und habe viele Stunden damit verbracht, verschiedene Methoden und Tutorials auszuprobieren, um dieses Problem zu lösen, aber immer noch nicht erfolgreich.Knockout mehrere Schaltflächen erweitern ihre entsprechenden div
Dies ist die Ansicht Abschnitt:
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<div class="firstDiv">
\t <!-- ko if: $root.filteredAvailabilities().length > 0 -->
\t <!-- ko foreach: $root.filteredAvailabilities -->
\t <div class="secondDiv">
\t \t <div class="thirdDiv">
\t \t \t <div class="fourthDiv">
\t \t \t \t <div class="fifthDiv">
\t \t \t \t \t <!-- ko with: Items -->
\t \t \t \t \t <div class="sixthDiv">
\t \t \t \t \t \t <!-- ko if: !$root.viewPrices() -->
\t \t \t \t \t \t <input class="actionButton" type="button" data-bind="upperCaseValue: $parents[1].ViewPrices, click: $root.ViewPrices" />
\t \t \t \t \t \t <!-- /ko -->
\t \t \t \t \t \t <!-- ko if: $root.viewPrices() -->
\t \t \t \t \t \t <input class="actionButton" type="button" data-bind="upperCaseValue: $parents[1].HidePrices, click: $root.HidePrices" />
\t \t \t \t \t \t <!-- /ko -->
\t \t \t \t \t </div>
\t \t \t \t \t <!-- /ko -->
\t \t \t \t </div>
\t \t \t \t <!-- ko if: $root.viewPrices() -->
\t \t \t \t <!-- ko foreach: Rooms -->
\t \t \t \t <div class="seventhRoomDiv">
\t \t \t \t \t <table class="roomPriceTable">
\t \t \t \t \t \t <tr>
\t \t \t \t \t \t \t <td><span class="roomPriceTableRoomLabel" data-bind="text: Room.Name"></span></td>
\t \t \t \t \t \t </tr>
\t \t \t \t \t </table>
\t \t \t \t </div>
\t \t \t \t <!-- /ko -->
\t \t \t \t <!-- /ko -->
\t \t \t </div>
\t \t </div>
\t \t <!-- ko if: $root.viewPrices() -->
\t \t <div class="eighthBottomDiv">
\t \t \t <input class="actionButton chooseRoomButton" type="button" data-bind="upperCaseValue: $parent.ChooseRoom, click: $root.ChooseRoom" />
\t \t </div>
\t \t <!-- /ko -->
\t </div>
\t <!-- /ko -->
\t <!-- /ko -->
</div>
Nach Ansicht Modell all seine Tun viewPrices true setzen:
/// <summary>
/// View the prices.
/// </summary>
self.ViewPrices = function()
{
self.viewPrices(true);
};
Ich möchte nur, dass der entsprechende seventDivRoom angezeigt wird, nachdem ich auf die angefügte Schaltfläche geklickt habe, anstatt alle anzuzeigen.
Nach der Erweiterung - Expanded alle drei statt der zweite nur:
EDIT
ich versucht habe, Rafael Companhoni Beispiel mit und es auf meine Versionen, aber ich stoße auf einige Schwierigkeiten, um das div anzuzeigen. Ich habe
self.ShowRoomPrice = ko.observable(false);
der Ansicht Modell. Dann hinzugefügt availability.ShowRoomPrice = false; zum Verfügbarkeits-Callback, der ähnlich ist, wie Sie das beobachtbare Array erstellt haben. Ich habe Weiterhin
self.Test = function (availability){
availability.ShowRoomPrice = !availability.ShowRoomPrice
model.availability(availability);
};
Schließlich wird die Ansicht wie folgt aussieht
<!-- ko if: ShowRoomPrice === true -->
<input class="actionButton" type="button" data-bind="upperCaseValue: 'Show/Hide Prices', click: $root.ChooseHotel" />
<!-- /ko -->
Es ändert den Zustand des ShowRoomPrice zwischen wahr und falsch, aber die div hinzugefügt erscheint nicht. Gibt es etwas, das noch fehlt?
Haben Sie versucht, '<- ko, wenn : $ root.viewPrices -> '(ohne das'() ')? – Stefan
@Stefan Das Entfernen der() hat keinen Unterschied gemacht. Es zeigt sie immer noch an. – Nayon
Hmmm, es sieht so aus, als ob Sie eine einzige beobachtbare ko-Variable verwenden, um die Zustände der divs zu verwalten. Wenn dies der Fall ist, müssen Sie sicherstellen, dass jede "Zeile" eine eigene Statusvariable hat. – Stefan