2012-01-14 7 views
8

Я использую управление потоком без контейнеров в ko 2.0. Когда я обновляю элемент в моем наблюдаемом массиве, он не обновляет пользовательский интерфейс. Я обновляю массив как это:Обновление наблюдаемого массива не обновляется UI

this.editFormHost = function (formHost) { 
    ... 
    formHost.HostName = newHostName; 
    this.formHosts[index] = formHost; 
} 

Я имею в виду, что не обновляется, потому что обновление массива по индексу ничего не заехать Ко. От взгляда на the documentation похоже, что нет методов для обновления объекта, который, в свою очередь, обновит пользовательский интерфейс. Или есть?

+0

Немного трудно, чтобы помочь не видя ViewModel, и понимание того, что вы пытаетесь сделать. В качестве отправной точки вы видели этот вопрос http://stackoverflow.com/questions/8774943/knockoutjs-observablearray-to-update-when-inner-observable-is-changed и этот http://stackoverflow.com/questions/6425409/how-to-replace-a-given-index-element-in-knockoutjs? – saurus

ответ

15

Вот скрипка, демонстрирующая, как заменить элемент в наблюдаемом массиве и внести изменения в пользовательский интерфейс.

http://jsfiddle.net/johnpapa/ckMJE/

Ключевым моментом здесь является функция замены на observableArray. Вы также можете использовать сращивание.

... Обратите внимание на использование «заменить» ниже ...

var ViewModel = function() { 
    this.self = this; 
    self.index = ko.observable(0); // default 
    self.newColor = ko.observable("purple"); // default 
    self.colors = ko.observableArray([{ 
     color: 'red'}, 
    { 
     color: 'blue'}, 
    { 
     color: 'yellow'}]); 
    self.replaceIt = function() { 
     self.colors.replace(self.colors()[self.index()], { 
      color: self.newColor() 
     }); 
    }; 
}; 
ko.applyBindings(new ViewModel()); 
+5

кто-то должен добавить этот метод замены в документацию. отлично, спасибо! –

+1

хорошо пункт. Я добавил его к моему нокаут-курсу, потому что меня об этом много спрашивают. –

Смежные вопросы