web-dev-qa-db-ja.com

knockoutJSでobservablearrayをクローニング/コピーする最良の方法は何ですか?

質問はそれをすべて本当に言っています。 KnockoutJSで監視可能な配列を別の配列にコピーしたい。

49
jaffa

ObservableArrayを複製するには、次のようにします。

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

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

コピーだけを行いたい場合は、次のようにします。

viewModel.array1(viewModel.array2());

2番目の例の問題は、基になる配列が同じであるため、array1またはarray2にプッシュすると、両方が新しい値を持つことになります(どちらも同じ配列を指すため)。

61
RP Niemeyer

私は同じ仕事に直面しました。観測可能な配列を複製します。その方法を理解できる唯一の方法は、オブザーバブルをJSオブジェクトに変換してから、そのオブジェクトをオブザーバブルオブジェクトに変換することです。次の関数には、KnockoutJSマッピングプラグインが必要です。 http://knockoutjs.com/documentation/plugins-mapping.html

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

お役に立てれば

45
Garry English

次のようなものがあると仮定します。

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

次のことができるはずです。

modelB.iWantYourValues(modelA.someValues())
1

正確にはあなたが求めているものではありませんが、後世のためにこれを追加したいと思います...

オリジナルと同期を保つオブザーバブルのクローンを作成する場合(ほとんどの場合、オリジナルを維持しながら調整/デバウンスクローンを作成するため)、次のようなことができます。

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

0
caseyWebb