0

Dies ist ein wirklich Nischen-Szenario, wo ich idealerweise eine Bindung für eine Eigenschaft haben muss, aber in der Lage zu wissen, wo diese Eigenschaft innerhalb der Wurzel lebt Modell ansehen.Wissen, wo Observable im Root-Modell in foreach/abcendant Bindings in Knockout lebt

So zum Beispiel können sagen, ich habe das Objekt:

{ 
    id: ko.observable(1), 
    name: ko.observable("some user"), 
    groups: [ 
     { id: ko.observable(1), name: ko.observable("some group") }, 
     { id: ko.observable(2), name: ko.observable("some group") }, 
    ] 
} 

Hier ist das Problem, wenn ich Bindungen wie diese haben waren:

<div> 
<!-- ko foreach: groups --> 
    <input data-bind="value: name, custom-binding: { property: name, other: foo }" /> 
<!-- /ko --> 
</div> 

Jetzt muss ich in der Lage sein zu lösen name hier zu rootModel.groups[currentIndex].name im Gegensatz zu nur name. Derzeit glaube ich nicht, dass es eine Möglichkeit gibt, in der Bindung zu wissen, dass die Eigenschaft "name" ist, da es nur den Wert sieht, also muss ich dies als Zeichenfolge übergeben oder ein benutzerdefiniertes Attribut für das Objekt, das die Bindung enthält schaut nach. Wie auch immer, ich muss in der Lage sein, den Eigenschaftspfad für jede Observable (im Zusammenhang mit dem in seinem Gültigkeitsbereich verwendeten rootModel) im Rahmen der Bindung irgendwie zu erhalten.

Ich weiß, es scheint verrückt, und es ist, aber es ist immer noch etwas, was ich tun müssen, wenn überhaupt möglich. Daher ist foreach nur ein Szenario, bei dem sich der untergeordnete Bindungsbereich ändert und für alle Szenarios, die ich erstellen muss, um eine property-path für Eigenschaften zu erstellen, die mit dieser benutzerdefinierten Bindung verwendet werden, umgebrochen wird.

Also gibt es eine Möglichkeit, dies zu tun?

+0

ich nicht vollständig verstehen:

Dies wird genutzt die frage, aber könnte der ko.contextFor (element) helfer dich näher an dein ziel bringen? Und wie du schon sagtest, sollte "property" definitiv eine Zeichenkette sein. –

+0

Hey 'contextFor (element)' bietet Ihnen nur die gleiche Art von Kontext, den Sie innerhalb der Bindungen erhalten, also seine gesamten Objektwerte, nicht die Eigenschaftsnamen oder irgendetwas (und in den meisten Fällen brauchen Sie keine Eigenschaftsnamen). – Grofit

Antwort

0

Es schien keinen einfachen Weg zu geben, also musste ich Vorprozessoren für bestimmte Bindungen schreiben, um den Bereich zwischenzuspeichern und dann als neue Bindung zur Laufzeit anzuwenden (da Vorprozessoren nicht auf den Bindungskontext zugreifen können).

Dann werden sie in den tatsächlichen Bindungen proxied und sie suchen, wenn es einen übergeordneten mit einem vorhandenen Bereich gibt, dann wird die lokale Eigenschaft angefügt und für untergeordnete Suchvorgänge im Bindungskontext zwischengespeichert.

https://github.com/grofit/treacherous

So fühlen sich frei zu prüfen, wie seine dort getan und wenn es eine bessere Lösung ist, lass es mich wissen :)

Verwandte Themen