Os valores do objeto de exportação precisam resolver para um nome e uma propriedade de uma instância UiComponent, separados por um ':', por exemplo checkout.cart.total:title
.
O nome do destino de exportação deve incluir o componente de interface do usuário "namespace".
No seu exemplo, você define o valor como uma sequência, que é resolvida como uma propriedade do UiComponent que é a fonte de exportação. A exportação é indefinida quando você a inspeciona, porque esse não é um destino de exportação válido.
Aqui está um exemplo que funciona:
defaults: {
exportTarget: "foo.bar",
exportTargetProperty: "showMessage",
tracks: {
shouldShowMessage: true
},
exports: {
shouldShowMessage: '${$.exportTarget}:${$.exportTargetProperty}'
}
}
...
O texto acima copiará o valor da shouldShowMessage
propriedade para a propriedade showMessage
de um UiComponent com o nome completo foo.bar
toda vez que o valor for alterado.
Observe que isso não tornará automaticamente a propriedade de destino um KO também observável. Isso deve ser declarado explicitamente, se as alterações de valor acionarem o KO para renderizar novamente os nós DOM que acessam essa propriedade.
A propósito, adicionar shouldShowMessage
ao tracks
objeto o tornará um ko-es5 observável automagicamente. Usando um literal também ko.observable()
funciona.
No exemplo acima, exportTarget
e exportTargetProperty
são configurados no defaults
. Eles também podem ser especificados como parte das opções UiComponent no JSON, o que geralmente faz mais sentido, pois é aí que a hierarquia do UiComponent, incluindo os nomes do UiComponent, é definida.
Por fim, gostaria de observar que pessoalmente acho que sua solução usando um objeto de valor para passar o valor ao outro componente da interface do usuário é melhor do que usar exportações ou importações. Na minha experiência, manter o estado compartilhado no DOM ou nos UiComponents é uma receita para OOP de espaguete em todos os casos, exceto nos mais simples.
tracks
, a assinatura manual de observáveis não funciona maisthis.shouldShowMessage.subscribe is not a function
ao usá-this.shouldShowMessage.subscribe(function() { ... });
lo Funciona bem ao definir observáveis de qualquer outra maneira. Parece que estou perdendo um passo outracks
não cria um observável da mesma maneira.ko.getObservable(this, 'shouldShowMessage').subscribe(function(newValue) { ...});
(o primeiro argumento é o viewmodel (this
), o segundo o nome da propriedade rastreada. Mais informações aqui: github.com/SteveSanderson/knockout-es5