Вопрос говорит об этом на самом деле. Я хочу скопировать наблюдаемый массив в другой в KnockoutJS.
Каков наилучший способ клонирования/копирования наблюдаемого символа в нокаут?
Ответ 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 })