Eu escrevi algumas ligações personalizadas usando KnockoutJS. Ainda não tenho certeza de quando usar. ko.utils.unwrapObservable(item)
Olhando para o código, essa chamada basicamente verifica se item
é um observável. Se for, retorna o valor (), se não, apenas retorna o valor. Observando a seção Knockout sobre a criação de vínculos personalizados, eles têm a seguinte sintaxe:
var value = valueAccessor(), allBindings = allBindingsAccessor();
var valueUnwrapped = ko.utils.unwrapObservable(value);
Nesse caso, eles invocam o observável via, ()
mas também chamam ko.utils.unwrapObservable
. Estou apenas tentando entender quando usar um ou outro ou se devo sempre seguir o padrão acima e usar os dois.
ko.toJS(yourObject)
do que usarko.utils.unwrapObservable
, se estiver tentando fazer com que uma versão desembrulhada do objeto passe para um widget ou biblioteca de terceiros. Em geral, é mais seguro usarko.utils.unwrapObservable
para apoiar observáveis e não observáveis.ko.utils.unwrapObservable
. Olhando para o código, ele apenas verifica se é observável e, se for, o Knockout invoca()
para obter o valor do observável, caso contrário, ele apenas retorna o valor para não observável. Se tudo o que estou interessado é no valor dos dados passados para a ligação, por que não posso simplesmente usar sempre()
?myBinding
e alguém liga, ou seja, gostadata-bind="myBinding: myValue"
.myValue
pode ser um observável ou pode ser apenas uma propriedade simples no modelo de exibição. Se for apenas uma propriedade e eu a chamar como uma função, você receberá um erro.ko.utils.unwrapObservable
o retornará com segurança o valor, independentemente de você ter sido aprovado em um observável ou não.ko.unwrap
está disponível no 3.0+. Se você estiver usando uma versão anterior à 3.0, eleko.utils.unwrapObservable
ainda estará lá.A resposta anterior está correta, mas frequentemente passo funções para associações personalizadas (uma função que verifica as permissões ou determina o que fazer com base em outra coisa, etc). O que eu realmente precisava era desembrulhar qualquer função, mesmo que não fosse observável.
O seguinte desembrulha recursivamente TUDO:
Aqui está um exemplo de uma ligação personalizada simples que escrevi:
Dessa forma, bindingValue sempre contém um valor. Não preciso me preocupar se passei uma função, um observável, um valor ou mesmo uma função dentro de um observável. Isso vai desembrulhar tudo corretamente até chegar ao objeto que desejo.
Espero que ajude alguém.
fonte