在knockoutJS中克隆/复制observablearray的最佳方法是什么?

jaf*_*ffa 50 knockout.js

问题说的都是真的.我想在KnockoutJS中将一个可观察数组复制到另一个数组.

RP *_*yer 61

要克隆observableArray,您需要执行以下操作:

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

viewModel.clone = function() {
   viewModel.array1(viewModel.array2.slice(0));
};
Run Code Online (Sandbox Code Playgroud)

如果您只想复制一份,那么您可以:

viewModel.array1(viewModel.array2());
Run Code Online (Sandbox Code Playgroud)

第二个例子的问题是底层数组是相同的,因此推送到array1或array2将导致两者都具有新值(因为它们都指向同一个数组).

  • 根据我的经验,如果您的可观察数组充满了可观察的属性,这似乎通过引用进行复制,因为可观察对象本身就是对象.切片通过引用复制对象.你知道如何深度克隆淘汰阵列吗? (8认同)
  • 是的我只需要数组的值副本而不是参考副本,因此第一个选项应该最适合我的场景,谢谢. (2认同)

Gar*_*ish 45

我面临同样的任务; 克隆一个可观察的数组.我能弄清楚如何做的唯一方法是将observable转换为JS对象,然后将该对象转换为可观察对象.以下函数需要KnockoutJS映射插件:http: //knockoutjs.com/documentation/plugins-mapping.html

function cloneObservable(observableObject) {
    return ko.mapping.fromJS(ko.toJS(observableObject));
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

  • 小心,这与`ko.computed()`混淆,只存储值,你必须在克隆后重新定义`computed`. (8认同)
  • 如果您不想使用knockoutJS映射插件,另一个选项是将您的对象转换为JSON,并使用解析的json数据创建一个新的.因为我不想包含映射插件,因为我在这里只需要它:`self.myObservable(new koModel(JSON.parse(ko.toJSON(oldObservable))))` (5认同)
  • @Anri如果你来回进行映射,它也会与`__ko_mappings__`属性混淆.重新映射以前的`toJS`-em对象时,不要忘记忽略此属性. (2认同)