Wartości obiektu eksportu muszą zostać przetłumaczone na nazwę i właściwość instancji UiComponent, na przykład oddzielone znakiem „:” checkout.cart.total:title
.
Nazwa celu eksportu musi zawierać komponent interfejsu użytkownika „przestrzeń nazw”.
W twoim przykładzie ustawiono wartość na ciąg znaków, który jest tłumaczony na właściwość UiComponent, który jest źródłem eksportu. Eksport jest niezdefiniowany podczas inspekcji, ponieważ nie jest to prawidłowy cel eksportu.
Oto przykład, który działa:
defaults: {
exportTarget: "foo.bar",
exportTargetProperty: "showMessage",
tracks: {
shouldShowMessage: true
},
exports: {
shouldShowMessage: '${$.exportTarget}:${$.exportTargetProperty}'
}
}
...
Powyższe spowoduje skopiowanie wartości shouldShowMessage
właściwości do właściwości showMessage
UiComponent z pełną nazwą przy foo.bar
każdej zmianie wartości.
Zauważ, że nie spowoduje to automatycznie, że właściwość target będzie również możliwa do zaobserwowania KO. Należy to wyraźnie zadeklarować, jeśli zmiany wartości powinny spowodować, że KO ponownie wyśle węzły DOM, które uzyskują dostęp do tej właściwości.
Nawiasem mówiąc, dodanie shouldShowMessage
do tracks
obiektu sprawi, że będzie ko-es5 obserwowalny automatycznie. Używanie również dosłownych ko.observable()
dzieł.
W powyższym przykładzie exportTarget
i exportTargetProperty
są skonfigurowane w defaults
. Można je również określić jako część opcji UiComponent w JSON, co zwykle ma większy sens, ponieważ tutaj definiuje się hierarchię UiComponent, w tym nazwy UiComponent.
Na koniec chciałbym zauważyć, że osobiście uważam, że twoje rozwiązanie wykorzystujące obiekt wartości do przekazania wartości do innego komponentu interfejsu użytkownika jest lepsze niż używanie eksportu lub importu. Z mojego doświadczenia wynika, że utrzymywanie stanu współdzielonego w DOM lub w UiComponents to przepis na OOP spaghetti we wszystkich, oprócz najprostszych przypadkach.
tracks
, ręczne subskrybowanie obserwowalnych nie działa jużthis.shouldShowMessage.subscribe is not a function
podczas korzystania.this.shouldShowMessage.subscribe(function() { ... });
Działa dobrze, gdy ustawiasz obserwowalne w inny sposób. Wydaje mi się, że brakuje mi kroku lubtracks
nie tworzy obserwowalnego w ten sam sposób.ko.getObservable(this, 'shouldShowMessage').subscribe(function(newValue) { ...});
(pierwszy argument to viewmodel (this
), drugi to nazwa śledzonej właściwości. Więcej informacji tutaj: github.com/SteveSanderson/knockout-es5