【问题标题】:How to Bind Jquery Ajax to Parent如何将 Jquery Ajax 绑定到父级
【发布时间】:2013-11-08 21:18:19
【问题描述】:

在大家的帮助下,我得到了它。我将“上下文:”从“this.parentNode”更改为“this”。我仍然对“this”上下文感到困惑。通过有限的测试,它似乎解决了我运行多个实例的问题。谢谢你的帮助。新代码如下所示。

我是 jQuery 和 Javascript 的新手。我正在创建一个通用对象来导航数据库表 (NavDb)。如果我创建 1 个实例,它会完美运行。当我运行多个实例时,它失败了。我将问题追溯到我如何使用“this”。一个初始化/处理 ajax 请求的例程失败。一个表单可以有任意数量的选择器(自动完成或下拉菜单)。该例程递归地执行 ajax 请求,直到所有选择器都已初始化。 'this' 变量在进入 'success:' 函数时引用 ajax 对象。我需要一个对父对象的引用,所以我在第 2 行创建了一个 $this。问题是它创建了一个闭包并弄乱了第二个实例(我相信这就是正在发生的事情)。如何在成功函数中获取对父对象的引用?我可以将 ajax 请求绑定到父对象吗?我需要这样的东西:

var $this = this.parent;

希望我解释清楚了。

新代码

NavDb.prototype.getSelData = function () {
    if (this.curSelector >= this.selectors.length) {
        return;
    }
    else {
        var sql = this.selectors[this.curSelector].sql;
        $.ajax({
            url: 'php/select.php',
            type: 'POST',
            context: this,    // Only needed 'this' not this.parentNode.
            dataType: 'json',
            data: {
                'sql': sql
            }
        }).done(function (data) {
            if (data.success) {
                if (data.v.length > 0) {
                    this.selectors[this.curSelector].data = data;
                    if (this.selectors[this.curSelector].type == "autoComp") {
                        this.initAC();
                    };
                    if (this.selectors[this.curSelector].type == "dropDown") {
                        this.initDD();
                    };
                }
            }
            this.curSelector++;
            this.getSelData();
        }).fail(function (XHR, textStatus, errorThrown) {
            $("#status").html(getErrorText(XHR.responseText));
        });
    };
};

旧代码

   NavDb.prototype.ajaxSelData = function () {
        var $this = this;
        if (this.curSelector >= this.selectors.length) {
            $this = null;
            return;
        }
        else {
            var sql = $this.selectors[$this.curSelector].sql;
            $.ajax({
                url: 'php/select.php',
                type: 'POST',
                dataType: 'json',
                data: {
                    'sql': sql
                },
                success: function (data) {
                    if (data.success) {
                        if (data.v.length > 0) {
                            $this.selectors[$this.curSelector].data = data;
                            if ($this.selectors[$this.curSelector].type == "autoComp") {
                                $this.initAC();
                            };
                            if ($this.selectors[$this.curSelector].type == "dropDown") {
                                $this.initDD();
                            };
                        }
                    } else {
                        alert(data.error);
                    }
                    $this.curSelector++;
                    $this.ajaxSelData();
                }
            });
        };
    };

【问题讨论】:

  • 你可以尝试在你的ajax调用中使用contextcontext: this, 然后在你的回调中使用this 作为对象。

标签: javascript jquery ajax bind parent


【解决方案1】:

有关正确的上下文范围,请参阅this answer

您可以通过多种方式确保正确的上下文:

  • 使用context

    $.ajax({
         url: 'php/select.php',
         type: 'POST',
         context: this.parentNode,
         dataType: 'json',
         data: {
             sql: sql
         },
         success: function (data) {
             // 'this' is parentNode
         }
    })
    
  • 使用closure

    var parentNode = this.parentNode;
    success: function (data) {
        //you can now use 'parentNode'
    }
    
  • 使用$.proxy

    $.proxy(function(data){
        // 'this' is parentNode
    }, this.parentNode);
    

【讨论】:

  • 这些技术似乎都不适用于原型对象。我遇到了同样的错误。 TypeError: this.curSelector is undefined this.selectors[this.curSelector].data = data;
  • 检查属性 parentNode 后,原型对象中似乎不存在。如果我 console.log 它说未定义。
  • 好吧,我需要更多信息。 NavDb 是什么,你是如何构造它的?原型中的this 应该可以按预期工作。
【解决方案2】:

您的代码创建的闭包对于每个实例都是唯一的(它为每个实例创建一个单独的闭包),因此您认为闭包搞砸了第二个实例的理论是不正确的。

因此,像您之前那样创建单独的变量:

var $this = this;

这是一件非常好的事情,不会引起问题。


但是,如果你想要父节点,那么也许你应该这样做:

var parent = this.parent;    

然后在你的 ajax 函数中引用 parent 变量。


您也可以只将context 参数传递给您的ajax 调用,这将在成功处理程序回调中根据需要设置this 参数。

       $.ajax({
            url: 'php/select.php',
            type: 'POST',
            dataType: 'json',
            context: this.parent,        // add this line
            data: {
                'sql': sql
            },
           success: function (data) {
                // now the this pointer is set as desired in your callback here
                if (data.success) {

【讨论】:

  • 我尝试了这些技术,但它们似乎不适用于原型对象。当我 console.log this.parentNode 它返回未定义。任何其他想法。
  • @user2970483 - 我以为你在使用 DOM 对象。你有什么样的对象?它有什么特性?如果它有 .parent 属性,那么您可以使用它来代替 DOM 对象使用的 .parentNode。我已经向你展示了一般技术。您需要充分了解必须使用正确属性的对象类型。你的问题应该与原型无关,除非你的问题是你没有创建一个合适的对象(你没有公开的代码,所以我们不知道)。
  • @user2970483 - 你知道你通常不会在原型对象上运行代码吗?您在原型上定义属性,以便在创建原型时这些属性将出现在该类型的实际对象上(通常使用 new 运算符完成)。而且,一旦您使用该原型正确创建了一个对象,您就可以在该对象上使用属性/方法,它将具有所有正确的属性。
  • @user2970483 - 您是如何创建对象的每个实例的?
  • 首先,我要感谢您花时间帮助我。我包括了我正在做的事情的精简版。我正在使用 new 运算符创建一个对象。
猜你喜欢
  • 1970-01-01
  • 2012-05-29
  • 2013-02-02
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
相关资源
最近更新 更多