2011-09-13 13 views
15

¿Cómo utilizo KnockoutJS para vincular una colección de diccionarios a una lista de selección.KnockoutJS - Databind a una colección de diccionario

Si mi diccionario "Destinos" es la siguiente con JSON:

{"Europe":"Europe incl Egypt, Turkey & Tunisia","ANZO":"Australia & New Zealand","WorldwideUSA":"Worldwide (incl USA & Canada)"} 

¿Cómo se unen a un lista de selección. Algo como esto:

data_bind="value: Destination, options: Destinations.Value, optionsText: Destinations.Key" 

Respuesta

25

Por lo general, cuando se trata de un diccionario, tendrá que asignar a una matriz que contiene los objetos con propiedades clave/valor.

sería algo así como:

function mapDictionaryToArray(dictionary) { 
    var result = []; 
    for (var key in dictionary) { 
     if (dictionary.hasOwnProperty(key)) { 
      result.push({ key: key, value: dictionary[key] }); 
     } 
    } 

    return result; 
} 

Muestra aquí: http://jsfiddle.net/rniemeyer/7yDTJ/

+0

Ryan, ¿cómo preseleccionar un valor en el diccionario? En tu violín agregué valor a la opción seleccionada: ko.observable ("ANZO") y el segundo elemento no está preseleccionado. – user583066

+0

El ejemplo tiene 'optionsValue: 'value'', por lo que espera el valor en lugar de la clave. Actualicé la muestra: http://jsfiddle.net/rniemeyer/7yDTJ/ –

+0

Me gustaría ver el plugin de asignación http://knockoutjs.com/documentation/plugins-mapping.html –

4

Una opción más sencilla si va a crear la API de servidor es de convertir sólo el diccionario a una matriz en el servidor y devolver la matriz:

Dictionary<string, string> myDict = ... ; 
return myDict.toArray(); // returns KeyValuePair<string, string>[] 

Ahora se puede unir fácilmente a la matriz en nocaut ...

<select class="form-control" 
    data-bind="options: opts, optionsText: 'Value', optionsValue: 'Key', optionsCaption: 'Show All', value: filter.myVal"> 
</select> 
Cuestiones relacionadas