Подтвердить что ты не робот

Каков наилучший способ клонирования/копирования наблюдаемого символа в нокаут?

Вопрос говорит об этом на самом деле. Я хочу скопировать наблюдаемый массив в другой в KnockoutJS.

4b9b3361

Ответ 1

Чтобы клонировать наблюдаемый массив, вы хотели бы сделать:

var viewModel = {
    array1: ko.observableArray(["one", "two"]),
    array2: ko.observableArray()
};

viewModel.clone = function() {
   viewModel.array1(viewModel.array2.slice(0));
};

Если вы хотите просто сделать копию, то вы бы сделали:

viewModel.array1(viewModel.array2());

Проблема со вторым примером заключается в том, что базовый массив одинаков, поэтому нажатие на array1 или array2 приведет к тому, что оба будут иметь новое значение (поскольку оба они указывают на один и тот же массив).

Ответ 2

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

function cloneObservable(observableObject) {
    return ko.mapping.fromJS(ko.toJS(observableObject));
}

Надеюсь, что это поможет

Ответ 3

Предполагая, что у вас есть что-то вроде:

modelA { someValues: observableArray(); }
modelB { iWantYourValues: observableArray(); }

Вы должны уметь:

modelB.iWantYourValues(modelA.someValues())

Ответ 4

Не совсем то, что вы просите, но я хотел бы добавить это для потомков...

Если вы хотите клонировать наблюдаемое, которое будет синхронизироваться с оригиналом (чаще всего для создания дросселированного/debounced-клонирования при сохранении оригинала), вы можете сделать что-то как таковое:

const clone = ko.pureComputed(() => original()).extend({ rateLimit: 500 })