javascript - 使用 Knockout 克隆具有可观察数组的对象

标签 javascript knockout.js

我有一个名为ProductsViewModel的 View 模型 其中包含 ProductViewModel

的 observableArray

ProductViewModel 还包含一个 observableArray - of ProductPriceViewModel

我拥有的一个功能是我可以复制 ProductViewModel 并将其插入到 ProductsViewModel 数组中。

当我克隆时使用:

ko.mapping.fromJS(ko.toJS(itemToCopy));

它似乎没有正确复制 - prices 可观察数组没有填充 ProductPriceViewModel - 只是对象

这是 View 模型

var ProductsViewModel = function() {
    var self = this;

    self.products = ko.observableArray([new ProductViewModel()]);

    self.addNewProduct = function() {
        self.products.push(new ProductViewModel());
    };

    self.duplicateProduct = function() {
        var itemToCopy = ko.utils.arrayFirst(self.products(), function(item) {
            return item.visible();
        });

        //if i look at itemToCopy.prices() it is an array of ProductViewModel

        var newItem = ko.mapping.fromJS(ko.toJS(itemToCopy));
        //if i look at newItem.prices() it is an array of Object

        self.products.push(newItem);
    };
};

var ProductViewModel = function() {
    var self = this;

    self.name = ko.observable();
    self.visible = ko.observable(true);

    self.prices = ko.observableArray([new ProductPriceViewModel()]);

    self.addPrice = function() {
        self.prices.push(new ProductPriceViewModel());
    };
};

var ProductPriceViewModel = function() {
    var self = this;

    self.name = ko.observable();
    self.price = ko.observable();
};

最佳答案

我通过传递这样的映射配置解决了这个问题:

var mapping = {
    'prices': {
        create: function (options) {
            return new ServicePriceViewModel(options.data);
        }
    }
};

var newItem = ko.mapping.fromJS(ko.toJS(productToCopy), mapping);

并更改我的 ProductPriceViewModel 以接受数据作为参数:

var ProductPriceViewModel = function (data) {
    var self = this;

    self.name = ko.observable();
    self.description = ko.observable();
    self.price = ko.observable();
    self.priceIsFrom = ko.observable();

    if (data)
        ko.mapping.fromJS(data, {}, this);
};

关于javascript - 使用 Knockout 克隆具有可观察数组的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21525950/

相关文章:

javascript - 在 Ace 编辑器中禁用水平分割

javascript - 在 asp.net 和 vb.net web 应用程序中保存后如何关闭弹出窗体

javascript - 我怎样才能复制这个 knockout 可观察到的?

javascript - 你如何分离一个javaScript变量整数和它的小数来分别设置它们的样式?

javascript - 当文本框模糊且为空时隐藏文本框

javascript - 如何从 express 应用程序中获取 http.server?

javascript - 在构造函数中激活 knockout

javascript - 如何在 Knockout JS 中的 BindingHandler 中获取绑定(bind)表达式

data-binding - 带有选项绑定(bind)的 knockout 集自定义属性

javascript - 使用 Backbone.js 设置我的模型