2014-03-09 3 views
0

Я новичок в Knockout Js, я использую плагин Mapping для преобразования данных JSON, получаемых с сервера в элементы интерфейса. Я могу загрузить содержимое правильно в первый раз, однако последующие изменения данных не обновляют пользовательский интерфейс вообще.KnockOut Js Mapping Update не работает

Мой HTML файл имеет это (чей visiblilty я контролировать в сценарии)

<div id="Results" style="font-family: Tahoma,Verdana,sans-serif;font-size: 10pt; visibility: hidden" > 
    <form> 
     <h4>List of all Arguments</h4> 
     <ul data-bind="foreach: arguments"> 
     <li> Argument: <span data-bind="text: argumentName"> </span>: <input data-bind="value: defValue"/> </li> </ul> 
    </form> 
</div> 

Javascript функция имеет этот код,

function displayArguments(data){ 
    var page=document.getElementById('Results'); 
    page.style.visibility='visible'; 
    var viewModel = ko.mapping.fromJS(data); 
    ko.mapping.fromJS(data, viewModel); 
    if(applyBindingsInvokedAlready == 0){ 
     // applyBindingsInvokedAlready is global default to 0 
     ko.applyBindings(viewModel); 
     applyBindingsInvokedAlready =1; 
    } 
} 

Просто хотел сказать, что я попытался следующие шаги, прежде сообщение этого вопроса

  1. Пробовал ko.mapping.fromJS (данные, {}, viewModel);
  2. Tried ko.cleanNode (document.getElementById ('Results'))
  3. Как описано выше, вызовите ko.applyBindings (viewModel); только один раз.

Я потерян! :(

Пожалуйста, помогите мне понять ошибку, которую я делаю здесь. Заранее спасибо!

ответ

0

Проблема заключается вы перезапись вас существующая ВМ, когда вы должны проверить, если виртуальная машина определена и, если так сделать что-то вроде этого

KnockoutJS and binding a single object to a viewmodel

var viewModel; 
function displayArguments(data){ 
    var page=document.getElementById('Results'); 
    page.style.visibility='visible'; 
    if(!!viewModel){ 
     viewModel.prop1(data.prop1); // obviously prop1 is not what you use, I just dont 
             know whats in your model 
     viewModel.someObservableArray(data.someObservableArray); 
    }else 
    {   
     viewModel = ko.mapping.fromJS(data); 
     ko.mapping.fromJS(data, viewModel); 
     if(applyBindingsInvokedAlready == 0){ 
      // applyBindingsInvokedAlready is global default to 0 
      ko.applyBindings(viewModel); 
      applyBindingsInvokedAlready =1; 
    } 
} 
+0

Спасибо вам QBM5, но у меня есть проблема. My View модель содержит массив. Он может иметь любое количество элементов зависит по данным. Как я должен идти дальше в этом случае? Также, пожалуйста, помогите мне понять, почему привязка перерывов, когда мы пробуем var viewModel = ko.mapping.fromJS (данные); ko.mapping.fromJS (данные, viewModel); Если этого недостаточно, чтобы обновить viewModel и, в свою очередь, обновить интерфейс? Еще раз спасибо! – Sathya

+0

Я обновил свой ответ – QBM5

+0

Извинения, я не упомянул модель. Строковые данные json выглядят следующим образом: {"arguments": [{"argumentName": "a", defaultValue ":" c "}, {" argumentName ":" b "," defaultValue ":" d " }]} – Sathya

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