javascript knockout.js

javascript - Cuándo usar ko.utils.unwrapObservable?



knockout.js (2)

He escrito algunos enlaces personalizados usando KnockoutJS. Todavía no estoy seguro de cuándo usar ko.util.unwrapObservable(item) Mirando el código, esa llamada básicamente verifica si el item es observable. Si lo es, devuelve el valor (), si no es así, solo devuelve el valor. Mirando la sección en Knockout sobre la creación de enlaces personalizados, tienen la siguiente sintaxis:

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

En este caso, invocan la vía observable () pero luego también llaman a ko.utils.unwrapObservable . Solo trato de entender cuándo usar uno frente a otro o si siempre debo seguir el patrón anterior y usar ambos.


Debería usar ko.utils.unwrapObservable en casos donde no sabe si le han dado un observable o no. Esto comúnmente sería en un enlace personalizado donde un observable o no observable podría estar ligado a él.

En el código que tienes arriba, la llamada a valueAccessor() no es en realidad desenvolver un observable. Simplemente recupera el valor que se pasó al enlace en el contexto correcto (se envuelve en una función para protegerlo). El valor de retorno de valueAccessor() puede ser observable o no. Es lo que pasó con la encuadernación.


La respuesta anterior es correcta, pero a menudo paso funciones a enlaces personalizados (una función que verifica los permisos, o determina qué hacer en función de otra cosa, etc.). Lo que realmente necesitaba era desenvolver cualquier función, incluso si no es observable.

Lo siguiente recursivamente desenrolla TODO:

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

Aquí hay un ejemplo de un enlace personalizado simple que escribí:

//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 } } }

De esta forma, bindingValue siempre contiene un valor. No necesito preocuparme si paso en una función, un observable, un valor o incluso una función dentro de un observable. Esto desenvolverá adecuadamente todo hasta que llegue al objeto que quiero.

Espero que ayude a alguien.