Estoy usando tanto Knockout (versión 2.0) como jQuery Mobile (versión 1.0.1) en el mismo proyecto. El problema es con datos vinculantes para seleccionar listas. jQuery Mobile presenta listas de selección de una manera en la que el valor aparentemente seleccionado y la lista real son elementos separados. Esto se soluciona ejecutandoKnockout y jQuery Mobile: datos de enlace para seleccionar listas
$(element).selectmenu('refresh', true);
después de cambiar la lista o el valor seleccionado. Según mi experiencia, esta es una situación peligrosa ya que los desarrolladores a menudo olvidan actualizar la lista de selección.
Para facilitar esto, escribí mi propio manipulador de encuadernación Knockout. Los valores se unen a la lista de selección con el siguiente código:
<select name="selection" data-bind="jqmOptions: values, optionsValue: 'id', optionsText: 'name', value: selectedValue">
</select>
La implementación de jqmOptions:
ko.bindingHandlers.jqmOptions = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
if (typeof ko.bindingHandlers.options.init !== 'undefined') {
ko.bindingHandlers.options.init(element, valueAccessor, allBindingsAccessor, viewModel);
}
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
if (typeof ko.bindingHandlers.options.update !== 'undefined') {
ko.bindingHandlers.options.update(element, valueAccessor, allBindingsAccessor, viewModel);
}
var instance = $.data(element, 'selectmenu');
if (instance) {
$(element).selectmenu('refresh', true);
}
}
};
Este utiliza el nativo options
vinculante, pero además de eso, se actualiza automáticamente listas de selección después de cambiar los valores de la lista. Sin embargo, hay un problema con esto cuando estoy cambiando el valor seleccionado. Si primero configuro los valores de la lista, mi jqmOptions actualiza la lista de selección, pero en ese momento, el valor seleccionado todavía no está establecido. Terminé con una lista de selección, que tiene todos los valores correctos e internamente se selecciona la opción correcta, pero jQuery Mobile todavía muestra el valor predeterminado como seleccionado.
this.values(someArrayOfValues);
this.selectedValue(oneOfTheArrayValues);
Knockout no permite que fije primero el valor seleccionado, y luego poner los valores de la lista, ya que en este caso no hay valores permitidos cuando estoy estableciendo el valor seleccionado. Por lo tanto, el valor seleccionado siempre está indefinido.
¿Existe alguna manera de escribir un enlace personalizado Knockout que actualice el elemento de lista de selección en ambos casos: al cambiar el valor de la lista y al cambiar el valor seleccionado?
Actualmente me resolver esta situación con la siguiente código:
this.values(someArrayOfValues);
this.selectedValue(oneOfTheArrayValues);
this.values(someArrayOfValues);
Esto no es una solución muy elegante y sin embargo me gustaría resolverlo mejor.
Eche un vistazo a este artículo del blog: http://pieterderycke.wordpress.com/2012/09/22/creating- a-custom-knockout-binding-for-the-jquery-mobile-listview/Explica un enlace de lista de visitas personalizado para jquery mobile. – MuSTaNG