Я включил мой mapDictToArray()
функцию, но он просто преобразует объектов JavaScript в ключ-значение JS массива. Я бы не подумал, что это , способствуя возникновению проблемы.
Собственно, это было частью проблемы. Функция возвращает массив JavaScript, а не наблюдаемый массив, и поэтому не может использоваться должным образом Knockout. Я сделал следующие изменения в коде:
// The "mapDictToArray" makes a normal JS array, not a ko.observableArray();
// You can't simply "merge" a JS array with an observableArray(); you'll need
// some extra functionality for that: ko.utils.arrayPushAll()
// viewModel.colors(mapDictToArray(dict));
ko.utils.arrayPushAll(viewModel.colors(), mapDictToArray(dict));
// Apply the bindings *after* you've added the contents to the "colors" observable, in order to
// get the correct selected value
ko.applyBindings(viewModel);
Это должно сделать трюк (с правильным HTML без ()
)!
JSFiddle.
UPDATE
Я думал о своем решении, но что-то не правильно. Единственное, что было правильно, - это та часть, которую вам нужно применить привязки после, вы добавили содержимое цветов, наблюдаемых. This is your fiddle, с той частью движется вниз.
Это работает в вашем случае, но вам нужно использовать метод arrayPushAll
, когда уже есть данные внутри observableArray
. Этот метод объединяется, в то время как вы перезаписываете его, когда не используете его (example with data inside the observable).
Хм ... Когда я проверил вашу скрипку, все было наоборот. Он работал с 'favColorId', но не' favColorId() ' – NilsH
Скобки на favColorId не нужны. KO будет вызывать ko.utils.unwrapObservable() –
Выбирает ли нижний '? Они не используют скобки, и ни один из них не выбран для меня. – GONeale