2013-05-03 2 views
0

В моей модели представления с нокаутом у меня есть функция Save(), которая отправляет запрос POST JQuery. Внутри этого запроса POST есть вызов ko.toJS(this).Knockoutjs - функция внутри viewmodel, вызывающая нежелательную рекурсию

Всякий раз, когда я вызываю эту функцию сохранения, браузер становится невосприимчивым и в конце концов говорит мне, что слишком много рекурсии. После отладки (с помощью точек останова) я обнаружил, что при вызове метода toJS() он выполняет некоторую степень клонирования объекта, и при этом клонирование вызывает функцию Save(), которая, в свою очередь, вызывает функцию JS(). .. и есть рекурсия.

Почему именно это происходит, и есть ли способ избежать этого, не используя 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); 
      } 
     }); 
    }; 
} 

ОБНОВЛЕНИЕ: добавили всю модель представления (выше).

+0

Ваш текущий код по-прежнему работает. Но поскольку некоторые части отсутствуют, например, 'vmChangeRecord' и' vmConcepts' и 'sp.Utils.Localize'. трудно сказать, что вызывает рекурсию. Я бы прокомментировал строки за строкой свойства/функции/и т. Д. чтобы узнать, какая из них вызывает рекурсию. – nemesv

ответ

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(); 
+0

Похоже, вы правы. Так что же может быть неправильно с моей моделью зрения? (Я обновил вопрос, чтобы включить всю модель представления.) – awj

Смежные вопросы