Zugriffsindex von $ parent in knockout.js

87

In knockout.js 2.1.0 können Sie in einer Vorlage mit der foreach-Bindung über die Funktion $ index () auf den Index des aktuellen Elements zugreifen. Gibt es in einer verschachtelten foreach-Bindung eine Möglichkeit, über eine Vorlage auf den Index des $ parent zuzugreifen?

Angenommen, ich habe eine Datenstruktur wie diese:

var application = {
  topModel: [
    {
      {subModel: [{'foo':'foo'}, { 'bar':'bar'}]}, // this has top:0 and sub:0
      {subModel: [{'foo2':'foo2'}, { 'bar2':'bar2'}]} // this has top:0 and sub:1
    },
    {
      {subModel: [{'foo':'foo'}, { 'bar':'bar'}]} // this is top:1 sub:0
    },
    {
      {subModel: [{'foo':'foo'}, { 'bar':'bar'}]} // this is top:2 sub:0
      {subModel: [{'foo':'foo'}, { 'bar':'bar'}]} // this is top:2 sub:1
    },
    ...
    ]};

Damit möchte ich den Pfad zu jedem Modell unter Verwendung von Indizes drucken: [topModel-index subModel-index], so dass die Ausgabe ungefähr so ​​aussieht:

[0 0]
[0 1]
[1 0]
[2 0]
[2 1]
...

Ich habe die Modelle mit foreach gebunden, kann aber nicht herausfinden, wie ich im Kontext des Submodells auf den Index des topModels zugreifen kann. Das folgende Beispiel zeigt einen Ansatz, den ich ausprobiert habe, der jedoch nicht funktioniert, da ich nicht herausfinden kann, wie auf den Index des $ parent-Referrers zugegriffen werden kann.

<!--ko foreach: topModel -->
<!--ko foreach: subModel -->
  [<span data-bind="text: $parent.index()"></span>
  <span data-bind="text: $index()"></span>]
<!--/ko-->
<!--/ko-->

Sollte ausdrucken: 0 1, 0 2, 1 0, 1 1, 1 2, 2 0, 2 1, ...

Jørgen
quelle
Das brauchst du ()nach dem $indexdort eigentlich nicht mehr .
Matthew Schinckel
Wenn Sie eine jsfiddle mit dem erstellen könnten, was Sie haben, würde dies es einfacher machen. Oder veröffentlichen Sie Ihre Datenquelle und zeigen Sie den Modellcode an.
Matthew Schinckel
Im Moment arbeite ich nur am Prototyping, daher habe ich nicht viel mehr als das angegebene Beispiel. Ich bin jedoch offen für Vorschläge mit anderen Ansätzen.
Jørgen
Beschreiben Sie vielleicht, was Sie versuchen und nicht wie . Es kann einen anderen Ansatz geben.
Matthew Schinckel
Vielen Dank. Ich habe meine Frage geändert und hoffentlich ist es jetzt klarer?
Jørgen

Antworten:

185

um auf den Index des übergeordneten Objekts zuzugreifen, verwenden Sie

$parentContext.$index()

eher, als

$parent.index()
Brett Smith
quelle
Vielen Dank. Ich habe nur ewig versucht, das zu finden!
DavidHyogo
14
Um im Namen der Hirnlosigkeit zu explizit zu sein, muss man sich dennoch an $parentContext.$index()die Eltern wenden. ; ^) Ein bisschen mehr zu $ ​​parentContext hier , fwiw.
Ruffin
3
danke - auf jeden Fall erwähnenswert, im Kontext eines zusammengesetzten Werts müssten Sie das () hinzufügen, wenn Sie jedoch ein Element an den Index $ parentContext. $ binden würden, gemäß der Frage, die Sie nicht benötigen.
Brett Smith
5
Brauchen Sie Klammern$parentContext.$index()
Jaider
4
Ich wollte nur hinzufügen, dass das $parentContext.$parentContext.$index()funktioniert, wie Sie es auch erwarten würden.
Ryan Wheale
3

Der einfachste Weg, dies herauszufinden, ist das Herunterladen von "Knockout-Kontext" für Chrome. Dies zeigt Ihnen, welche Daten an welches Element gebunden sind, und zeigt Ihnen die verfügbaren Funktionen / Variablen für dieses bestimmte gebundene Element. Es ist ein erstaunliches Werkzeug für solche Situationen.

julianisch
quelle