0

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

每当我调用此 Save 函数时,浏览器就会变得无响应并最终告诉我递归过多。调试时(通过使用断点),我发现当我调用 toJS() 时,它似乎对对象进行了某种程度的克隆,并且在进行这种克隆时,它调用了 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);
            }
        });
    };
}

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

4

1 回答 1

0

你一定是做错了什么,对我来说有点小问题

http://jsfiddle.net/brN9s/

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();
于 2013-05-03T08:31:47.927 回答