Ich habe einige benutzerdefinierte Bindungen mit KnockoutJS geschrieben. Ich bin mir immer noch nicht sicher, wann ich ko.utils.unwrapObservable(item)
den Code verwenden soll. Bei diesem Aufruf wird im Grunde geprüft, ob item
er beobachtbar ist. Wenn dies der Fall ist, geben Sie den Wert () zurück. Wenn dies nicht der Fall ist, geben Sie einfach den Wert zurück. Im Abschnitt über Knockout zum Erstellen benutzerdefinierter Bindungen haben sie die folgende Syntax:
var value = valueAccessor(), allBindings = allBindingsAccessor();
var valueUnwrapped = ko.utils.unwrapObservable(value);
In diesem Fall rufen sie das Observable via auf ()
, rufen dann aber auch auf ko.utils.unwrapObservable
. Ich versuche nur herauszufinden, wann ich eines gegen das andere verwenden soll oder ob ich einfach immer dem obigen Muster folgen und beide verwenden soll.
ko.toJS(yourObject)
verwendenko.utils.unwrapObservable
, als sie zu verwenden , wenn Sie versuchen, eine entpackte Version des Objekts in ein Widget oder eine Bibliothek eines Drittanbieters zu übertragen. Im Allgemeinen ist die Verwendungko.utils.unwrapObservable
zur Unterstützung von Observablen und Nicht-Observablen am sichersten .ko.utils.unwrapObservable
. Wenn Sie sich den Code ansehen, wird nur geprüft, ob er beobachtbar ist. Wenn dies()
der Fall ist, ruft Knockout auf , um den Wert des beobachtbaren Codes abzurufen. Andernfalls wird nur der Wert für nicht beobachtbar zurückgegeben. Wenn mich nur der Wert der an die Bindung übergebenen Daten interessiert, warum kann ich ihn dann nicht immer verwenden()
?myBinding
und jemand bindet dh wiedata-bind="myBinding: myValue"
.myValue
Möglicherweise handelt es sich um eine beobachtbare Eigenschaft oder nur um eine einfache Eigenschaft des Ansichtsmodells. Wenn es nur eine Eigenschaft ist und ich sie wie eine Funktion aufrufe, erhalten Sie eine Fehlermeldung.ko.utils.unwrapObservable
wird Ihnen den Wert sicher zurückgeben, unabhängig davon, ob Sie ein Observable bestanden haben oder nicht.ko.unwrap
es in 3.0+ verfügbar ist. Wenn Sie älter als 3.0 verwenden,ko.utils.unwrapObservable
ist es immer noch da.Die frühere Antwort ist richtig, aber oft übergebe ich Funktionen an benutzerdefinierte Bindungen (eine Funktion, die Berechtigungen überprüft oder basierend auf etwas anderem usw. bestimmt, was zu tun ist). Was ich wirklich brauchte, war, jede Funktion auszupacken, auch wenn sie nicht beobachtbar ist.
Folgendes packt rekursiv ALLES aus:
Hier ist ein Beispiel für eine einfache benutzerdefinierte Bindung, die ich geschrieben habe:
Auf diese Weise enthält bindingValue immer einen Wert. Ich muss mir keine Sorgen machen, ob ich eine Funktion, ein Observable, einen Wert oder sogar eine Funktion innerhalb eines Observable übergeben habe. Dadurch wird alles ordnungsgemäß ausgepackt, bis das gewünschte Objekt erreicht ist.
Hoffe das hilft jemandem.
quelle