2013-05-23 10 views
0

Я пытаюсь добавить объект по умолчанию к моему нокауту observableArray. То, как мой код стоит в настоящее время, я в конечном итоге добавляю тот же объект к массиву вместо нового экземпляра объекта. Я попытался использовать jQuery's .extend(), но это не сработало, поэтому я ищу вход.Как я могу копировать этот нокаут наблюдаемый?

Вот демонстрация, чтобы показать мою проблему: http://jsfiddle.net/2c8Fx/

HTML:

<div data-bind="foreach: People"> 
    <input type="text" data-bind="value: Name" /> 
</div> 

<button type="button" data-bind="click: AddPerson">Add Person</button> 

<pre data-bind="text: ko.toJSON($data, null, 2)"></pre> 

Script:

function ViewModel() { 
    var self = this; 

    self.EmptyPerson = ko.mapping.fromJS({Name: null, Age: null}); 
    self.People = ko.observableArray([self.EmptyPerson]); 

    self.AddPerson = function() { 
     self.People.push(self.EmptyPerson); 
    }; 
} 

ko.applyBindings(new ViewModel()); 

Это не работает, потому что на самом деле observableArray держа ссылку на тот же объект для eac h индекс.

Каков наилучший способ создать новый экземпляр моего объекта Knockout?

+0

@jonhopkins - Это приведет к ошибке, когда 'метод AddPerson' называется. –

+0

@jonhopkins - Не беспокойтесь, спасибо, что посмотрели. –

ответ

2
function ViewModel() { 
    var self = this; 

    self.People = ko.observableArray(); 

    self.AddPerson = function() { 
     self.People.push(ko.mapping.fromJS({Name: null, Age: null})); 
    }; 
} 

ko.applyBindings(new ViewModel()); 

Я сделал это, и он работает так, как вы думаете. Надеюсь, это поможет.

Заканчивать рабочий пример here

+0

Я предполагаю, что это может работать с небольшим изменением (мне нужно значение по умолчанию в моем массиве, чтобы я мог переместить вызов 'mapping.fromJS' на метод, который просто возвращает объект Knockout). –

+0

Есть ли что-нибудь, что мешает вам принять это в качестве ответа? Я ответил на ваш вопрос, как было сказано. – arb

+2

Похоже, кто-то немного беспокоится за очки! Мне нравится ждать более 20 минут, чтобы узнать, есть ли другие ответы и предлагают другие решения. –

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