Die Werte des Exportobjekts müssen in einen Namen und eine Eigenschaft einer UiComponent-Instanz aufgelöst werden, die beispielsweise durch ein ':' getrennt sind checkout.cart.total:title
.
Der Exportzielname muss die UI-Komponente "Namespace" enthalten.
In Ihrem Beispiel setzen Sie den Wert auf eine Zeichenfolge, die in eine Eigenschaft der UiComponent aufgelöst wird, die die Exportquelle darstellt. Der Export ist undefiniert, wenn Sie ihn überprüfen, da dies kein gültiges Exportziel ist.
Hier ist ein Beispiel, das funktioniert:
defaults: {
exportTarget: "foo.bar",
exportTargetProperty: "showMessage",
tracks: {
shouldShowMessage: true
},
exports: {
shouldShowMessage: '${$.exportTarget}:${$.exportTargetProperty}'
}
}
...
Mit dem obigen Befehl wird der Wert der shouldShowMessage
Eigenschaft showMessage
bei foo.bar
jeder Änderung des Werts mit dem vollständigen Namen in die Eigenschaft einer UiComponent kopiert .
Beachten Sie, dass dadurch die Zieleigenschaft nicht automatisch auch als KO beobachtbar wird. Dies muss explizit deklariert werden, wenn Wertänderungen KO auslösen sollen, um DOM-Knoten, die auf diese Eigenschaft zugreifen, erneut zu rendern.
Übrigens macht das Hinzufügen shouldShowMessage
zum tracks
Objekt es zu einem automatisch beobachtbaren Ko-es5. Die Verwendung eines wörtlichen ko.observable()
Werks funktioniert auch.
Im obigen Beispiel sind die exportTarget
und exportTargetProperty
in der konfiguriert defaults
. Sie können auch als Teil der UiComponent-Optionen im JSON angegeben werden, was normalerweise sinnvoller ist, da dort die UiComponent-Hierarchie einschließlich der UiComponent-Namen definiert wird.
Abschließend möchte ich darauf hinweisen, dass ich persönlich der Meinung bin, dass Ihre Lösung, bei der ein Wertobjekt verwendet wird, um den Wert an die andere UI-Komponente zu übergeben, besser ist als die Verwendung von Exporten oder Importen. Nach meiner Erfahrung ist das Beibehalten des gemeinsamen Status im DOM oder in UiComponents in allen außer den einfachsten Fällen ein Rezept für Spaghetti-OOP.
tracks
sind einige Probleme aufgetreten . Das manuelle Abonnieren von Observablen funktioniertthis.shouldShowMessage.subscribe is not a function
bei Verwendung nicht mehr.this.shouldShowMessage.subscribe(function() { ... });
Es funktioniert einwandfrei, wenn Observables auf andere Weise festgelegt werden. Es fühlt sich an, als würde mir ein Schritt fehlen oder ich kanntracks
nicht auf die gleiche Weise ein Observable erstellen.ko.getObservable(this, 'shouldShowMessage').subscribe(function(newValue) { ...});
einfügen und verwenden (das erste Argument ist das viewmodel (this
), das zweite den Namen der verfolgten Eigenschaft. Weitere Informationen hier: github.com/SteveSanderson/knockout-es5