web-dev-qa-db-fra.com

Quel est le meilleur moyen de cloner/copier un tableau observable dans knockoutJS?

La question dit tout vraiment. Je veux copier un tableau observable sur un autre dans KnockoutJS.

49
jaffa

Pour cloner un observableArray, vous voudrez faire:

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

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

Si vous voulez juste faire une copie, alors vous feriez:

viewModel.array1(viewModel.array2());

Le problème avec le deuxième exemple est que le tableau sous-jacent est le même, aussi, si vous appuyez sur array1 ou array2, les deux auront la nouvelle valeur (puisqu'ils pointent tous deux vers le même tableau).

60
RP Niemeyer

J'étais confronté à la même tâche; cloner un tableau observable. La seule façon pour moi de comprendre comment procéder consiste à convertir l'observable en objet JS, puis à le convertir en objet observable. La fonction suivante nécessite le plug-in de mappage KnockoutJS: http://knockoutjs.com/documentation/plugins-mapping.html

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

J'espère que cela t'aides

45
Garry English

En supposant que vous ayez quelque chose comme:

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

Tu devrais être capable de:

modelB.iWantYourValues(modelA.someValues())
1
Steven Dickinson

Ce n'est pas exactement ce que vous demandez, mais j'aimerais ajouter ceci pour la postérité ...

Si vous voulez cloner un observable qui reste synchronisé avec l'original (le plus souvent pour créer un clone étranglé/rebondi tout en conservant l'original), vous pouvez faire quelque chose comme ceci:

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

0
caseyWebb