【问题标题】:What is the best way of cloning/copying an observablearray in knockoutJS?在 knockoutJS 中克隆/复制 observablearray 的最佳方法是什么?
【发布时间】:2011-09-24 10:57:03
【问题描述】:

问题说明了一切。我想在 KnockoutJS 中将一个 observable 数组复制到另一个数组。

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    要克隆一个你想要做的 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 将导致两者都具有新值(因为它们都指向同一个数组)。

    【讨论】:

    • 是的,我只想要数组的值副本而不是引用副本,所以第一个选项应该最适合我的场景,谢谢。
    • 根据我的经验,如果您的可观察数组充满了可观察属性,这似乎是通过引用复制的,因为可观察对象本身就是对象。 Slice 通过引用复制对象。你知道如何深度克隆敲除数组吗?
    【解决方案2】:

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

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

    希望对你有帮助

    【讨论】:

    • 小心,这与ko.computed() 混淆了,只存储值,你必须在克隆后重新定义computed
    • @Anri - 感谢您发表评论...它为我节省了几个小时!加里 - 请用这个更新答案!
    • 如果您不想使用 knockoutJS 映射插件,另一种选择是将您的对象转换为 JSON 并使用解析的 json 数据创建一个新对象。由于我不想包含映射插件,因为我只需要在这里我做了:self.myObservable(new koModel(JSON.parse(ko.toJSON(oldObservable))))
    • @Anri 如果您来回进行映射,它也会与__ko_mappings__ 属性混淆。重新映射之前的toJS-em 对象时不要忘记忽略此属性。
    • 使用 ko.mapping.fromJS(ko.mapping.toJS(observableObject));以防止 ko_mappings 导致稍后编辑推送的克隆对象时出现问题。遇到了同样的问题,使用 mapping.toJS 解决了。
    【解决方案3】:

    假设你有类似的东西:

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

    你应该能够:

    modelB.iWantYourValues(modelA.someValues())
    

    【讨论】:

      【解决方案4】:

      不完全是你的要求,但我想为后代添加这个......

      如果您想克隆一个与原始数据保持同步的 observable(通常是在保持原始数据的同时创建一个受限制/去抖动的克隆),您可以这样做:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-29
        • 1970-01-01
        • 1970-01-01
        • 2016-07-14
        • 1970-01-01
        • 2019-01-21
        • 2012-12-06
        相关资源
        最近更新 更多