Клонирование 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