Ручная подписка Knockout не срабатывает

Я только что начал проект, в котором пытаюсь использовать нокаут для своих привязок модели представления. Но у меня проблема, когда я не могу заставить модель представления реагировать на изменения (через ручную подписку), сделанные в представлении в поле выбора.

var viewModel = function() {
   var self = this;
   self.project = ko.observable();
   self.contractBorders = ko.observable();

   self.contractBorders.subscribe(function (newvalue) {
       alert('something changed!');
   });
};

viewModel.load = function() {
var data = {"project":{"name":"Project XYZ",
"number":338,"id":1,"isNew":false},"contractBorders":[{"name":"Border 1 grund","id":1},   
{"name":"Border 2","id":2},{"name":"Border 3","id":3}]}

viewModel.loadView(data);

};
viewModel.loadView = function(data) {
    self.project = ko.mapping.fromJS(data.project);
    self.contractBorders = ko.mapping.fromJS(data.contractBorders);
    ko.applyBindings(viewModel);    
};

viewModel.load();

Я ожидаю, что "self.contractBorders.subscribe" будет выполнен, но этого никогда не происходит. Я делаю это совершенно неправильно?

Я создал Fiddle для воспроизведения проблемы здесь

Любая помощь будет оценена по достоинству!

/BR Винблад


person Vinblad    schedule 05.11.2012    source источник


Ответы (1)


У вас много маленьких ошибок в привязке и viewModel
1)

viewModel.loadView = function(data) {
    viewModel.project = ko.mapping.fromJS(data.project);
    viewModel.contractBorders = ko.mapping.fromJS(data.contractBorders);
    ko.applyBindings(viewModel);    
};  

2)

var viewModel = new function() {  

3)

 <div class="span2">
                <select  

4)

<input type="text" id="name" name="name" data-bind="value: project().name" />

http://jsfiddle.net/6zzSy/22/

Здесь я добавляю наблюдаемое значение - selectedBorder
http://jsfiddle.net/6zzSy/24/

здесь я оптимизирую ваш код
http://jsfiddle.net/6zzSy/25/

person Ilya    schedule 05.11.2012
comment
Спасибо Спасибо спасибо. Потратил 2 дня на эту проблему! - person Vinblad; 06.11.2012
comment
Быстрый дополнительный вопрос. Можно ли получить объект, на который изменилось поле выбора, а не только идентификатор элемента? - person Vinblad; 06.11.2012
comment
@Vinblad не используйте параметр optionValue в <select>. jsfiddle.net/6zzSy/27 - person Ilya; 06.11.2012
comment
@llya, можно ли установить начальное выбранное значение в поле выбора. На самом деле элемент проекта имеет контрактную границу, и я хотел бы установить начальное значение поля выбора таким же, как значение project.contracBorder (которое в моей демонстрации не было частью jsondata)? - person Vinblad; 06.11.2012