【发布时间】:2011-09-24 10:57:03
【问题描述】:
问题说明了一切。我想在 KnockoutJS 中将一个 observable 数组复制到另一个数组。
【问题讨论】:
标签: knockout.js
问题说明了一切。我想在 KnockoutJS 中将一个 observable 数组复制到另一个数组。
【问题讨论】:
标签: knockout.js
要克隆一个你想要做的 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 或 array2 将导致两者都具有新值(因为它们都指向同一个数组)。
【讨论】:
我也面临同样的任务;克隆一个可观察的数组。我能弄清楚如何做到这一点的唯一方法是将 observable 转换为 JS 对象,然后将该对象转换为 observable 对象。以下功能需要 KnockoutJS 映射插件: http://knockoutjs.com/documentation/plugins-mapping.html
function cloneObservable(observableObject) {
return ko.mapping.fromJS(ko.toJS(observableObject));
}
希望对你有帮助
【讨论】:
ko.computed() 混淆了,只存储值,你必须在克隆后重新定义computed。
self.myObservable(new koModel(JSON.parse(ko.toJSON(oldObservable))))
__ko_mappings__ 属性混淆。重新映射之前的toJS-em 对象时不要忘记忽略此属性。
假设你有类似的东西:
modelA { someValues: observableArray(); }
modelB { iWantYourValues: observableArray(); }
你应该能够:
modelB.iWantYourValues(modelA.someValues())
【讨论】:
不完全是你的要求,但我想为后代添加这个......
如果您想克隆一个与原始数据保持同步的 observable(通常是在保持原始数据的同时创建一个受限制/去抖动的克隆),您可以这样做:
const clone = ko.pureComputed(() => original()).extend({ rateLimit: 500 })
【讨论】: