【问题标题】:How can I send an object via Ajax from within a Javascript Class?如何从 Javascript 类中通过 Ajax 发送对象?
【发布时间】:2015-08-21 19:10:30
【问题描述】:

我的问题标题可能措辞不好,抱歉。

我想创建一个 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 
              }
        });
  }
  
});

这就是我尝试使用该类的方式:

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 页面:

但相反,我得到的是“未捕获 RangeError:超出最大调用堆栈大小”

为什么会发生这种情况,我怎样才能达到预期的效果?


更新:#

根据昆汀的建议,这让我得到了整理

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

【问题讨论】:

  • @GobSmack — 问题中没有任何内容表明 Ajax 调用应该发送 JSON。 PHP 默认不会解析 JSON。
  • 你能贴出你的PHP页面片段吗?
  • 你的 addParent 函数需要 3 个参数,你只是传递给它一个数组。但这不应该导致错误。
  • @blex 谢谢,不是问题,但我确实需要解决这个问题

标签: javascript jquery ajax oop


【解决方案1】:

当您将对象传递给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,然后将其反序列化以去除所有函数,然后再通过 data: 将其传递给 param
  3. 将对象序列化为 JSON,将其作为字符串传递给 data:,设置请求 contentType: "application/json",并将 PHP 更改为期望 JSON 格式的请求而不是表单格式的请求。
  4. (我不知道这是否可行)更改构造类的方式以使用Object.defineProperty() 并标记所有函数,使其不是enumerable。我怀疑这种方法会失败,因为对象本身就是一个函数。

【讨论】:

  • 你说得对,我的对象中的所有函数都在 Ajax 发送之前在 window 的上下文中再次调用。我不确定如何在不混淆问题的情况下解释我在那里看到的内容。现在这完全有道理。非常感谢您,我将实施您建议的更改。
猜你喜欢
  • 2015-12-19
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多