KnockoutJS - привязка к коллекции словарей

Как использовать KnockoutJS для привязки коллекции словарей к списку выбора.

Если мой словарь "Destinations" выглядит так в JSON:

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

Как привязать это к списку выбора. Что-то вроде этого:

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

Ответы

Ответ 1

Как правило, при работе со словарем вам нужно сопоставить его с массивом, содержащим объекты с свойствами ключа/значения.

Будет что-то вроде:

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

    return result;
}

Пример здесь: http://jsfiddle.net/rniemeyer/7yDTJ/

Ответ 3

Более простой вариант, если вы создаете API-интерфейс сервера, - это просто преобразовать словарь в массив на сервере и вернуть массив:

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

Теперь вы можете легко привязать массив к нокауту...

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