2011-12-22 24 views
10

Estoy tratando de utilizar el valor vinculante para el elemento de selección, tal como se describe en este violín: http://jsfiddle.net/MikeEast/nM6dd/2/valor de falla para selecto al tener tipos complejos

Sin embargo, me parece que no puede ser capaz de establecer el seleccionado opción (enlace de valor).

Sé que puedo usar el enlace optionsValue, pero eso hace que el valor sea una cadena en lugar de un objeto que no es preferible. Si ese es el único camino a seguir, ¿cómo lo haría para asegurarme de que la opción seleccionada se vuelva a escribir en el modelo de vista?

Gracias!

Respuesta

17

Aquí está la solución. Debe agregar el atributo optionsValue: 'id' al enlace de datos. También tiene que poner una función en viewModel que devuelve el objeto seleccionado.

HTML

<select data-bind="options: items, optionsText: 'name', optionsValue: 'id', value: selectedItemId"></select> 
<span data-bind="text: selectedItem().name"></span> 

JS

var viewModel = function() { 
    this.items = ko.observableArray([ 
     { id: 1, name: "Apple" }, 
     { id: 2, name: "Orange"}, 
     { id: 3, name: "Banana"} 
    ]); 
    this.selectedItemId = ko.observable(3); 
    this.selectedItem = function() { 
     var self = this; 
     return ko.utils.arrayFirst(this.items(), function(item) { 
      return self.selectedItemId() == item.id; 
     }); 
    }.bind(this); 
}; 

var vm = new viewModel(); 
ko.applyBindings(vm); 

Salud!

+0

Gracias por su contribución. Resuelve la pregunta que hice. Sin embargo, mi problema está enraizado en otra causa que esta. Estoy cargando la matriz desde el servidor de forma asíncrona y cuando obtengo la respuesta, establezco el valor de observableArray. Esto significa que el array observable recarga/vuelve a enlazar, lo que a su vez lo hace ignorar el * valor * previamente establecido. Eso podría ser por diseño, pero no estoy seguro. Aquí hay un violín que muestra el comportamiento: http://jsfiddle.net/MikeEast/nM6dd/12/ –

+0

Ya veo. El problema es que this.selected es un observable y se establece en 2. Por knockout de diseño, puede cambiar el valor de esto. Se selecciona cuando se cambia el valor de la lista. Porque la lista vacía al principio this.selected queda sin definir. Cuando lo completa, de forma predeterminada se establece en el primer elemento. Puede resolver esto guardando el elemento seleccionado actual en una variable propia y usando la función subscribe en knockout. –

Cuestiones relacionadas