Knockout клонирането не работи с функционални екземпляри

По принцип това, което прочетох и използвах досега за клониране на масив без никакви препратки между тях, е нещо подобно:

var clonedArray = ko.observableArray(originalArray().slice(0));

Но в следния пример изглежда не работи:

var field = function(settings){
  var _self = this;
    _self.Id = settings.Id;
    _self.Flag = ko.observable(settings.Flag);
    return _self;
};

var viewModel = function(){
 var _vm = this;

    _vm.fields = ko.observableArray([
        new field({Id: 1, Flag: true}),
        new field({Id: 2, Flag: false})
    ]);

    _vm.fieldsCloned = ko.observableArray(_vm.fields().slice(0));

    return _vm;
};

ko.applyBindings(new viewModel());

person skmasq    schedule 24.04.2014    source източник
comment
Създадохте плитък клонинг на масив. Така че всеки масив съдържа същите препратки към обектите, към които препраща оригиналният масив. Предполагам, че сте искали да направите дълбок клонинг...   -  person Jeff Mercado    schedule 24.04.2014
comment
@JeffMercado Да, прав си. Актуализирах въпроса си, за да включва отговор.   -  person skmasq    schedule 24.04.2014
comment
Не, не правете това, ако имате отговор на въпроса си, публикувайте го като отговор.   -  person Jeff Mercado    schedule 24.04.2014


Отговори (1)


Отговор

Препратка към този отговор

Бях изправен пред същата задача; за клониране на наблюдаем масив. Единствената причина, поради която мога да разбера как да го направя, е да конвертирам наблюдавания в JS обект, след което да конвертирам този обект в наблюдаем обект. Следната функция изисква плъгин за картографиране на KnockoutJS: http://knockoutjs.com/documentation/plugins-mapping.html

function cloneObservable(observableObject) {
    return ko.mapping.fromJS(ko.toJS(observableObject));
}
person skmasq    schedule 24.04.2014