2015-07-06 2 views
0

У меня есть эта функция:ViewModel не обновляется при вызове обновления функции()

function updatedata(data) 
{ 
    var obj = jQuery.parseJSON(data); 

    if(obj.hasOwnProperty('request_type')) 
    { 
    if (obj.request_type == 'client_information') 
    { 

     var ViewModel = function (Clients) { 
      var self = this; 
      this.Clients = ko.mapping.fromJSON(JSON.stringify(Clients)); 
     }; 

     var info = new ViewModel(obj.clients_information); 
     ko.applyBindings(info); 
    } 
    } 
} 

HTML:

<ul id="mychats" data-bind="foreach: Clients" data-role="listview"> 
<li class="not_selected" data-bind="id: chatid, text: client_name"></li> 
</ul> 

Функция называется время от времени, он может правильно привязать данные к ul, когда его вызывают в первый раз, но не тогда, когда его называют более одного раза.

+0

Если вы вызывали 'updatedata' более одного раза, вы могли бы вызвать вызов' ko.applyBindings' более одного раза, что обязательно приведет к ошибке. Вы проверили консоль? Кроме того, любой шанс, что вы можете немного переписать код в своем вопросе, чтобы он воспроизводил ваш сценарий? – Jeroen

+0

Кроме того, вы должны прочесть прочитав [документацию по сопоставлению] (http://knockoutjs.com/documentation/plugins-mapping.html), у него есть информация о том, как обновлять модели представлений, созданные с помощью этого плагина. – Jeroen

ответ

3

Нельзя применять привязки более одного раза (что должно вызвать ошибку - проверьте консоль).

Вместо того чтобы воссоздать viewModel каждый раз, просто поместите информацию о клиентах в наблюдаемую и обновите наблюдаемую новую информацию о клиенте в функции обновления.

Что-то вроде:

var ViewModel = function (Clients) { 
    var self = this; 
    this.Clients = ko.observableArray(Clients); // As you use the foreach binding, I assume it's an array 
}; 

var obj = jQuery.parseJSON(data); 

var info = new ViewModel(obj.clients_information); 
ko.applyBindings(info); 

function updatedata(newData) 
{ 
    info.Clients(newData); 
} 

См this fiddle.

Или, если вы хотите использовать ko.mapping:

var viewModel = ko.mapping.fromJS(obj); 

function updatedata(newData) 
{ 
    ko.mapping.fromJS(newData, viewModel); 
} 

Это вводит новые данные в существующую ViewModel.

В качестве альтернативы нет связи id. Вместо этого используйте attr: { id: chatid }.