编程语言
首页 > 编程语言> > JavaScript-Knockout.js:克隆一个ObservableArray-Object

JavaScript-Knockout.js:克隆一个ObservableArray-Object

作者:互联网

我想克隆/(深层)复制一个基因敲除js observableArray中的项目.

我在网上找不到有关此问题的任何信息.每个人都想要克隆克隆孔阵列;)

这是jsfiddle:
http://jsfiddle.net/drchef/dCHMC/1/

在那里,您可以看到,我正在使用在SO上找到的Deepcopy方法.

this.cloneLine = function() {
    //This 2 lines is what i found on SO. Should work, but doesn not :(
    //cloning the second line (sry hardcoded...)
    var lastLine = this.lines()[1];
    this.lines.push(jQuery.extend(true, {}, lastLine));
};

在viewmodel-output中,您可以看到副本正在运行…但是在内部,新项目和克隆项目的引用仍为相同的值.
如果您在新行中更改值,那么它在原始行中也会更改.

背景:
我有一个输入网格,如果用户在最后一行中并且在想要输入新行时单击“输入”,则该行与最后一行的数据相同

我不想编写任何方法,或者某个女巫正在克隆每个数据.在vm的每次更改中,我都必须更新映射. ;(

谢谢

解决方法:

您需要在Line视图模型中打开可观察对象.您可以使用ko.toJS实用程序方法执行此操作. Demo

function Line(line) {
    this.a = ko.observable(line && line.a);
    this.b = ko.observable(line && line.b);
    this.c = ko.observable(line && line.c);
};

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

    this.lines = ko.observableArray([]); 

    this.cloneLine = function(line) {
        var l = new Line(ko.toJS(line));
        self.lines.push(l);
    };

    this.cloneLastLine = function() {
        var lines = self.lines(),
            line = lines[lines.length - 1];
        self.cloneLine(line);
    };
}

var model = new ViewModel();

//Initial Data
model.lines.push(new Line({ a: 0, b: 1, c: 2}));
model.lines.push(new Line({ a: 2, b: 1, c: 0}));

ko.applyBindings(model);

标签:knockout-js,javascript,jquery
来源: https://codeday.me/bug/20191121/2052345.html