2011-06-28 63 views

回答

57

要复制observableArray你会想这样做:

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

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

如果你想只是做一个副本,那么你会怎么做:

viewModel.array1(viewModel.array2()); 

与第二实施例中的问题是,底层数组是相同的,所以推到ARRAY1或数组2会导致两个具有新的值(因为它们都指向相同的数组)。

+2

是的,我只希望该数组的值复制,而不是一个参考副本,以便第一个选项应该是我的方案最适合,谢谢。 – jaffa

+4

根据我的经验,这似乎是通过引用复制如果您的可观察数组充满可观察的属性,因为观察者本身是对象。切片通过引用复制对象。你知道如何深入克隆淘汰赛阵列吗? – PrinceTyke

1

假设你有这样的:

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

您应该能够:

modelB.iWantYourValues(modelA.someValues()) 
42

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

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

希望这有助于

+7

小心,这个用'ko.computed()'搞砸了,只存储值,你必须在克隆后重新定义'computed'。 – Anri

+0

@Anri - 感谢您发表您的评论...它节省了我的时间!加里 - 请用这个更新答案! – Kevin

+4

如果您不想使用knockoutJS映射插件,另一个选项是将您的对象转换为JSON并使用解析的json数据创建一个新的对象。因为我不想包括映射插件,因为我只需要在这里我做: 'self.myObservable(新koModel(JSON.parse(ko.toJSON(oldObservable))))' – Gigi2m02

0

你问不完全是,但我想添加这个留给后人......

如果你想克隆与原始数据保持同步的观察值(通常在保留原始数据的同时创建一个节流/去抖动克隆),你可以这样做:

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

相关问题