Quando usare ko.utils.unwrapObservable?

Ho scritto alcuni binding personalizzati usando KnockoutJS. Non sono ancora sicuro di quando usare ko.util.unwrapObservable(item) Guardando il codice, quella chiamata controlla essenzialmente se l’ item è osservabile. Se lo è, restituisci il valore (), se non lo è, basta restituire il valore. Guardando la sezione su Knockout sulla creazione di collegamenti personalizzati, hanno la seguente syntax:

 var value = valueAccessor(), allBindings = allBindingsAccessor(); var valueUnwrapped = ko.utils.unwrapObservable(value); 

In questo caso, invocano l’osservabile tramite () ma poi chiamano anche ko.utils.unwrapObservable . Sto solo cercando di capire quando usare l’uno o l’altro o se dovrei sempre seguire lo schema sopra e usare entrambi.

Dovresti usare ko.utils.unwrapObservable nei casi in cui non sai se ti è stato dato un osservabile o meno. Questo sarebbe normalmente in un legame personalizzato dove un osservabile o non osservabile potrebbe essere vincolato contro di esso.

Nel codice che hai sopra, la chiamata a valueAccessor() non sta in realtà scartando un osservabile. Si tratta semplicemente di recuperare il valore passato al binding nel contesto corretto (viene incluso in una funzione per proteggerlo). Il valore restituito da valueAccessor() può essere osservabile o meno. È tutto ciò che è stato passato al binding.

La risposta precedente è corretta, ma spesso passo in funzioni a binding personalizzati (una funzione che controlla le autorizzazioni, o determina cosa fare in base a qualcos’altro, ecc.). Quello di cui avevo davvero bisogno era di scartare qualsiasi funzione, anche se non è osservabile.

Di seguito viene ricorsivo in modo ricorsivo TUTTO:

 ko.utils.unwrapFunction = function (func) { if (typeof func != 'function') { return func; } else { return ko.utils.unwrapFunction(func()); } }; 

Ecco un esempio di una semplice associazione personalizzata che ho scritto:

 //replaces single and double 'smart' quotes users commonly paste in from word into textareas and textboxes with normal text equivalents //USAGE: //data-bind="replaceWordChars:true //also works with valueUpdate:'keyup' if you want" ko.bindingHandlers.replaceWordChars = { update: function (element, valueAccessor, allBindingsAccessor, viewModel) { var bindingValue = ko.utils.unwrapFunction(valueAccessor); if (bindingValue) { $(element).val(removeMSWordChars(allBindingsAccessor().value())); //update DOM - not sure why I should need to do this, but just updating viewModel doesn't always update DOM correctly for me allBindingsAccessor().value($(element).val()); //update viewModel } } } 

In questo modo bindingValue contiene sempre un valore. Non ho bisogno di preoccuparmi se ho passato in una funzione, un osservabile, un valore o anche una funzione all’interno di un osservabile. Questo scarterà correttamente tutto fino a raggiungere l’object che voglio.

Spero che aiuti qualcuno.