【问题标题】:Ajax setting 'context' does not affect 'data's locationAjax 设置“上下文”不影响“数据”位置
【发布时间】:2013-07-31 07:27:21
【问题描述】:

以下 Ajax 作品

function Retrieve(el) {
    var table = this;
    this.el = el;
    this.fetchInfo = function () {
        $.ajax('data.html', {
            context: table,
            <!-- QUESTION HERE -->
            data: {
                location: table.data('location')
            },
            success: function (response) {
                this.el.find('.info').html(response).fadeIn();
            },
        }
        }

但我想知道为什么我不能用this.data 在表示的行上替换table.data。由于我将上下文设置为table 变量,所以this 现在应该设置为table 所指的任何内容,对吗?这适用于 Ajax 对象的其他成员(包括success)的上下文,但不适用于data 的成员。为什么会这样?

data('name') 从属性为data-name 的标签中提取值

【问题讨论】:

    标签: javascript ajax syntax


    【解决方案1】:

    您提供的context 变量仅适用于success 回调,并且不会更改传递给$.ajax 的任何其他参数。

    因此,答案取决于您实际致电fetchInfo 的方式。 data: 变量将在 fetchInfo 具有的任何上下文中解析。鉴于您遇到问题,这表明您没有Retrieve 对象作为其上下文调用函数。

    EDIT这行是你的问题:

    this.el.on('click', 'button', this.fetchInfo);
    

    仅仅因为您引用了this.fetchInfo,并不会在随后调用this 时将其作为上下文。试试这个:

    this.el.on('click', 'button', $.proxy(this.fetchInfo, this));
    

    【讨论】:

    • 澄清一下,要进入function 内部,该变量会启动context 变量以替换this 的上下文?我没有遇到任何问题,但我只是想知道为什么。我将如何更改我的代码以使 this.data 可以替换 table.data
    • 你说你“不能用this.data替换table.data”,说明你试过了,失败了。您可以替换它,只要将fetchInfo 称为this.fetchInfo()table.fetchInfo(),从而确保this 内部fetchInfo 具有与它外部相同的值 .
    • 好的,我同意你所说的一切,但我仍然没有弄清楚为什么回调成员和非回调成员的上下文不同。你能告诉我为什么会有不同吗?
    • @Forethinker 因为你必须在你的问题中包含一些额外的代码,显示你如何调用Retrieve 函数,以及你如何调用fetchInfo
    • 好的。我已经包含了额外的代码。我认为$(document).ready(function() { 部分就足够了,但为了确定,我包含了其他代码部分。
    【解决方案2】:

    查看$.ajax()documentation,我发现context 被设置为callbackContext 变量。这可以使用successerrorbeforeSendcomplete,但不能使用data 选项。

    AJAX 选项被分配给名为 s 的变量:

    s = jQuery.ajaxSetup({}, options),
    

    data 选项被转换为字符串,但callBackContext 未被使用。

    // Convert data if not already a string
    if (s.data && s.processData && typeof s.data !== "string") {
        s.data = jQuery.param(s.data, s.traditional);
    }
    

    因此需要使用this以外的变量来设置为data指定元素。

    【讨论】:

    • 我刚刚回滚到原来的问题,在你问我更多代码之前我有这个问题。
    • 这不是很有帮助,因为它完全破坏了我给出的答案的上下文(不是双关语)。你想知道如何在data: 块中使用this,我给你的答案告诉你如何 - 通过修复this 是什么时候fetchInfo 被调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多