Escribí algunos enlaces personalizados usando KnockoutJS. Todavía no estoy seguro de cuándo usar. ko.utils.unwrapObservable(item)
Mirando el código, esa llamada básicamente verifica si item
es un observable. Si es así, devuelve el valor (), si no es así, devuelve el valor. Mirando la sección sobre 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 ko.utils.unwrapObservable
. Solo estoy tratando de saber cuándo usar uno frente al otro o si debo seguir siempre el patrón anterior y usar ambos.
ko.toJS(yourObject)
lugar de usarko.utils.unwrapObservable
, si está tratando de obtener una versión sin empaquetar del objeto para pasar a un widget o biblioteca de terceros. En general, es más seguro utilizarloko.utils.unwrapObservable
para respaldar observables y no observables.ko.utils.unwrapObservable
. Al mirar el código, solo verifica si es observable y, si lo es, Knockout invoca()
para obtener el valor de lo observable; de lo contrario, solo devuelve el valor de no observable. Si todo lo que me interesa es el valor de los datos que se pasan al enlace, ¿por qué no puedo usarlo siempre()
?myBinding
y alguien se une, es decir, me gustadata-bind="myBinding: myValue"
.myValue
podría ser un observable o podría ser simplemente una propiedad simple en el modelo de vista. Si es solo una propiedad y la llamo como una función, obtendrá un error.ko.utils.unwrapObservable
le devolverá el valor de forma segura independientemente de si se le pasó un observable o no.ko.unwrap
está disponible en 3.0+. Si está utilizando una versión anterior a 3.0,ko.utils.unwrapObservable
todavía está ahí.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 desenvuelve de forma recursiva TODO:
Aquí hay un ejemplo de un enlace personalizado simple que escribí:
De esta forma, bindingValue siempre contiene un valor. No necesito preocuparme por si pasé una función, un observable, un valor o incluso una función dentro de un observable. Esto desenvolverá correctamente todo hasta que llegue al objeto que quiero.
Espero que ayude a alguien.
fuente