Значения объекта экспорта должны соответствовать имени и свойству экземпляра UiComponent, разделенных, например, знаком «:» checkout.cart.total:title
.
Имя цели экспорта должно включать компонент пространства имен интерфейса пользователя.
В вашем примере вы устанавливаете значение в строку, которая преобразуется в свойство UiComponent, являющегося источником экспорта. При проверке экспорт не определен, поскольку это недопустимая цель экспорта.
Вот пример, который работает:
defaults: {
exportTarget: "foo.bar",
exportTargetProperty: "showMessage",
tracks: {
shouldShowMessage: true
},
exports: {
shouldShowMessage: '${$.exportTarget}:${$.exportTargetProperty}'
}
}
...
Выше будет копировать значение shouldShowMessage
свойства в свойство showMessage
UiComponent с полным именем foo.bar
каждый раз, когда значение изменяется.
Обратите внимание, что это автоматически не сделает целевое свойство также наблюдаемым. Это должно быть объявлено в явном виде, если изменение значения должно привести к тому, что KO повторно отобразит узлы DOM, которые обращаются к этому свойству.
Кстати, добавление shouldShowMessage
к tracks
объекту сделает его автоматически видимым в ko-es5. Использование буквальных ko.observable()
произведений тоже.
В приведенном выше примере exportTarget
и exportTargetProperty
настроены в defaults
. Они также могут быть указаны как часть параметров UiComponent в JSON, что обычно имеет больший смысл, поскольку именно здесь определяется иерархия UiComponent, включающая имена UiComponent.
Наконец, я хотел бы отметить, что лично я считаю, что ваше решение, использующее объект значения для передачи значения другому компоненту пользовательского интерфейса, лучше, чем использование экспорта или импорта. По моему опыту, сохранение общего состояния в DOM или в UiComponents - это рецепт ООП для спагетти во всех случаях, кроме самых простых.
tracks
, ручная подписка на observables больше не работаетthis.shouldShowMessage.subscribe is not a function
при использовании.this.shouldShowMessage.subscribe(function() { ... });
Это прекрасно работает при установке observables любым другим способом. Такое ощущение, что я пропускаю шаг илиtracks
не создаю наблюдаемое таким же образом.ko.getObservable(this, 'shouldShowMessage').subscribe(function(newValue) { ...});
(первый аргумент - viewmodel (this
), а второй - имя отслеживаемого свойства. Подробнее здесь: github.com/SteveSanderson/knockout-es5