Я только начал использовать нокаут, но я уже был опытным с MVVM, применяемым в WPF. Проблема, с которой я сталкиваюсь, заключается в том, что моя модель представления нокаута, обертывающая объект модели, не обновляет эту оригинальную модель. Вот небольшой пример:Связывание нокаутом не обновляет модель
HTML
<select name="size" id="sel-size" data-bind="options: sizes, value: size"></select>
JS
// default settings
var settings = {
size: 5
};
// settings view model
var settingsVM = function() {
return {
sizes: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
size: ko.observable(settings.size)
}
}();
// subscribe to changes
settingsVM.size.subscribe(function() {
alert("Model: " + settings.size + "/VM: " + settingsVM.size());
})
ko.applyBindings(settingsVM);
Когда выпадающий выбор изменяется, только settingsVM.size()
из модели представления обновляется, но settings.size
из модели остается прежней.
Кажется, что инициализация observable
со ссылкой не поддерживает эту ссылку в качестве поля поддержки для аксессуара свойства. Что мне не хватает в MVVM-способе нокаута?
Это действительно означало бы, что Knockout не "модель в курсе".Как только вы вытащите модель с сервера, отредактируйте ее с помощью модели представления и хотите сохранить ее на сервере, это означает, что вам нужно переписать свою модель с нуля? Также мне приходится подписываться на прокси-сервер, чтобы обновить исходные эталонные звуки. – Ucodia
Вам не нужно использовать подписку вообще, это немного анти-шаблон с нокаутом imo. Что касается круговых поездок на сервер, это легко - вы можете прямо перейти от json к вашему vm, а затем использовать служебную функцию, такую как ko.toJSON, чтобы де-нокаутировать ваш vm, чтобы отправить его обратно. См. Здесь: http://knockoutjs.com/documentation/json-data.html –
@Ucodia Я думаю, вы обнаружите, что Knockout проще, если вы не настаиваете на том, чтобы следовать примеру отдельной модели. Ваша модель находится на сервере. Вам просто нужно получить данные в своем приложении и записать данные из вашего приложения обратно на сервер. –