Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serialization Knockoutjs-viewmodel内的函数,导致不需要的递归_Serialization_Recursion_Knockout.js - Fatal编程技术网

Serialization Knockoutjs-viewmodel内的函数,导致不需要的递归

Serialization Knockoutjs-viewmodel内的函数,导致不需要的递归,serialization,recursion,knockout.js,Serialization,Recursion,Knockout.js,在我的Knockout视图模型中,我有一个Save()函数,它发送jQuery POST请求。在这个POST请求中调用了ko.toJS(this) 每当我调用这个Save函数时,浏览器就会变得无响应,并最终告诉我递归太多。在调试时(通过使用断点),我发现当我调用toJS()时,它似乎对对象进行了某种程度的克隆,在进行克隆时,它调用了Save()函数,而Save()函数反过来又调用toJS()。。。这就是递归 为什么会发生这种情况,有没有一种不使用toJSON()就能避免这种情况的方法 [我还有一

在我的Knockout视图模型中,我有一个Save()函数,它发送jQuery POST请求。在这个POST请求中调用了
ko.toJS(this)

每当我调用这个Save函数时,浏览器就会变得无响应,并最终告诉我递归太多。在调试时(通过使用断点),我发现当我调用toJS()时,它似乎对对象进行了某种程度的克隆,在进行克隆时,它调用了Save()函数,而Save()函数反过来又调用toJS()。。。这就是递归

为什么会发生这种情况,有没有一种不使用toJSON()就能避免这种情况的方法

[我还有一个关于toJSON的问题,这解释了我为什么不想使用它。]

为了完整起见,这里是我的视图模型

function vmDictionary(dict) {

    if (dict === null || dict === undefined) {
        return;
    }

    var self = this;

    // directly-assigned variables
    self.Concepts = new vmConcepts(dict.Concepts);
    self.Deleted = ko.observable(dict.Deleted);
    self.Description = ko.observable(dict.Description);
    self.IncludeInSearch = ko.observable(true);
    self.ID = ko.observable(dict.ID);
    self.Languages = ko.observableArray(dict.Languages);
    self.LastUpdate = new vmChangeRecord(dict.LastUpdate);
    self.Name = ko.observable(dict.Name);
    self.Public = ko.observable(dict.Public);

    self.TemplateName = function(observable, bindingContext) {
        return "dictionary-template";
    };

    // computed variables
    self.PublicText = ko.computed(function() {
        return sp.Utils.Localize(self.Public
            ? "Public"
            : "Private");
    });

    // exposed functions
    self.Save = function () {
        $.ajax({
            data: ko.toJSON(self),
            dataType: "json",
            type: "POST",
            url: [...],
            statusCode: {
                200: function (response) {
                    console.log(response);
                }
            },
            error: function (xmlHttpRequest, textStatus, errorThrown) {
                console.log(xmlHttpRequest);
                console.log(textStatus);
                console.log(errorThrown);
            }
        });
    };
}

更新:添加了整个视图模型(如上)。

你一定做错了什么,对我来说有点麻烦


看来你是对的。那么,我的视图模型会有什么问题呢?(我已经更新了问题以包括整个视图模型。)您当前的代码仍然有效。但是因为缺少了一些部分,比如
vmchangecord
vmConcepts
sp.Utils.Localize
。很难说是什么导致了递归。我会逐行注释掉属性/函数等,看看是哪一个导致了递归。。。。
ViewModel = function() {
    this.someData = ko.observable("Test");
    this.dto = ko.observable();
};

ViewModel.prototype = {
    Save: function() {
        this.dto(ko.toJS(this));        
    }
};

var viewModel = new ViewModel();
ko.applyBindings(viewModel);
viewModel.Save();