2015-08-21 5 views
1

Мое название вопроса не может быть правильно сформулировано, извините.Как я могу отправить объект через Ajax из класса Javascript?

Я хочу создать класс Javascript для упрощения отправки информации на php-страницу.

Я использую метод, описанный в this answer создать свой класс

Это то, что я до сих пор:

var ParseObject = Class.extend({ 
    init: function(classname, id){ 
    // required properties 
    this.classname=classname; 
    this.objects=[]; 
    this.fields=[]; 
    // optional properties 
    if(id && id != '') this.id=''; 
    //this.command = command; 
    //this.callback=''; 
    //this.parent=[]; 
    //this.children=[]; 
    //this.relation=''; 
    }, 
    set: function(field, value) { 
     if(field == 'classname') this.classname=value; 
     else if(field == 'callback') this.callback=value; 
     else if(field == 'command') this.command=value; 
     else this.fields.push(field, value); 
    }, 
    addChild: function(obj){ 
     this.children ? this.children.push(obj) : this.children= [obj]; 
    }, 
    addParent: function(linkedFieldName, parentClassName, parentId){ 
     this.parent=[linkedFieldName, parentClassName, parentId]; 
    }, 
    addObject: function(obj){ 
     this.objects.push(obj); 
    }, 
    isRelatedBy: function(relation){ 
     this.relation=relation; 
    }, 
    send: function(){ 
     var obj = this; 
     $.ajax({ 
       type: "POST", 
       dataType: "json", 
       url: "php/parseFunctions.php", 
       data: {data:obj}, 
       success: function(response) { 
        // do stuff 
       }, 
       error: function(response) { 
        // do stuff 
       } 
     }); 
    } 

}); 

А вот как Im пытается использовать класс:

var testObject = new ParseObject('TestObject'); 
testObject.set('callback','testResopnse'); 
testObject.set('command','save'); 
testObject.set('title','New Title'); 
testObject.set('description','New Description'); 
testObject.set('stuff',['one','two','three']); 
testObject.addParent(['parent', 'MeComment', 'kRh5xcpkhz']); 
testObject.send(); 

Все работает как ожидается, пока не доберусь до testObject.send();

Что я ожидаю для ниже объекта присылают на мой PHP странице:

enter image description here

Но вместо того, что я получаю «Uncaught RangeError: Максимальный размер стека вызовов превысил»

Почему это произойдет, и как я могу достичь желаемого результата?


Обновление: #

За предложение Квентина, это заставило меня отсортирован

var obj =$.parseJSON(JSON.stringify(this)); 
+1

@GobSmack - Ничто в вопросе не предполагает, что Ajax-звонок должен отправить JSON. PHP не будет разбирать JSON по умолчанию. – Quentin

+0

Можете ли вы опубликовать фрагмент страницы PHP? – lssilveira

+1

Функция 'addParent' ожидает 3 параметра, вы передаете только массив. Но это не должно вызывать ошибки. – blex

ответ

4

При передаче объекта data:, JQuery будет call param on it.

Эта функция включает в себя этот код:

// If value is a function, invoke it and return its value 
value = jQuery.isFunction(value) ? value() : (value == null ? "" : value); 

Это заканчивается тем, что назвали все функции в объекте (в том числе конструктор) в контексте window. У меня нет целей выяснить все последствия этого, но это явно нежелательно и, основываясь на сообщении об ошибке, приводит к бесконечной рекурсии.

У вас есть несколько вариантов здесь:

  1. Написать явную функцию, которая извлекает данные, которые вы заботитесь о от объекта и представляет в виде простой структуры данных, состоящей только из типов данных, вы можете сериализацию с.
  2. сериализации объект JSON, а затем deserialise его раздеть все функции, прежде чем передать его param через data:
  3. сериализации объекта в формат JSON, передать, что в виде строки в data:, установите запрос contentType: "application/json" и изменить PHP ожидает отформатированный запрос JSON вместо форматированного запроса формы.
  4. (я не знаю, будет ли это работать) измените способ создания класса для использования Object.defineProperty() и отметьте все функции, чтобы они не были enumerable. Я подозреваю, что этот подход потерпит неудачу, потому что объект сам по себе является функцией.
+0

Вы правы, все функции в моем объекте вызываются снова в контексте 'окна', прежде чем Ajax даже отправит. Я не был уверен, как объяснить, что я там вижу, не запутывая вопрос. Теперь это имеет смысл. Большое вам спасибо, что внесем предложенные вами изменения. – DelightedD0D

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