2014-02-18 3 views
0

Я хочу обновить ui с помощью нокаута js binding. Я могу обновить список, но изменения не отражаются в ui. Я получаю следующее сообщение об ошибке:Обновить элемент html с нокаутом js binding

Uncaught Error: You cannot apply bindings multiple times to the same element. 

Ниже мой код: Когда я проверить длину массива, оповещение показывает массив обновляется, но я хочу, чтобы изменения, которые будут отражены в пользовательском интерфейсе также.

<!DOCTYPE html> 
<html> 
<head> 
<script src="js/knockout-3.0.0.js"></script> 
<script> 

var Person = [ { 
    name : "qwe qwe", 
    number : 123123123 
}, { 
    name : "asd asd", 
    number : 999999999 
} ]; 

var myVM = function() { 
    this.persons = ko.observableArray(Person); 
} 

function init() { 
alert(Person.length); 
    ko.applyBindings(new myVM()); 
} 

function AddPerson() 
{ 
PushToArray(Person,"name","123"); 
init(); 
} 

function PushToArray(array, var1, var2) { 
    array.push({ 
     name : var1, 
     number : var2 
    }); 
} 
</script> 

</head> 
<body onload="init()"> 
      <div> 
       <button onclick="AddPerson()">Add</button>    
        <div data-bind="foreach:persons"> 
         <p data-bind="text:name"> </p> 
        </div>      
      </div>  
</body> 
</html> 
+2

вам не нужно вызывать ko.applyBindings (новый myVM()) при добавлении человек, это должно быть сделано только один раз – Cris

+0

Спасибо, человек, ваше предложение сработало – mayurd

ответ

0

Функция ko.applyBindings() должна быть вызвана только один раз. С тех пор каждое изменение, которое вы делаете на наблюдаемые объекты в viewmodel, будет автоматически отражено в парне.

Просто удалите вызов функции init(); внутри AddPerson() функции и называть его только один раз где-то еще, и это должно решить проблему

+0

Жаль, что не было ясно, что после удаления init() вам все равно придется называть его из другого места, но только один раз. –

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