Как получить переменную функции в функции AJAX Done - PullRequest
2 голосов
/ 18 июня 2019

У меня есть эта функция JS:

$('.editable').change(function () {
    event.preventDefault();
    var el_text = this.lastElementChild;
    var action = this.action;
    var method = this.method;
    var data = $(this).serialize();

    $.ajax({
        url: action,
        type: method,
        data: data,
    }).done(function (resp) {

        // alert('has changed!');
    });
});

Как я могу получить el_text внутри done () , который здесь не определен?

Ответы [ 3 ]

2 голосов
/ 18 июня 2019

Вы можете сделать это так, потому что объем выполненного обратного вызова Функция считает это в своей области видимости, чтобы получить эту переменную Вы можете просто сослаться на это в переменной, которая вне ajax

var objectElement = this;

затем после завершения обратного вызова вы можете назвать его следующим образом.

$.ajax({
       url: action,
       type: method,
       data: data,
}).done(function (resp) {
     $(objectElement).lastElementChild;     
});
0 голосов
/ 18 июня 2019
$('.editable').change(function () {
    event.preventDefault();
    var el_text = this.lastElementChild;
    var action = this.action;
    var method = this.method;
    var data = $(this).serialize();

    // $.ajax({
    //     url: action,
    //     type: method,
    //     data: data,
    // }).done(function (resp) {
    //     // when this is called, el text could be something else as the change event could fire multiple times by differnt element.
    // });

    (function(el_text){
        // now el_text in here is locked in this function scope, 
        // won't be affected by the parent scope
        $.ajax({ 
            url: action,
            type: method,
            data: data,
        }).done(function (resp) {
            // now you can do something with el_text here
        });
    })(el_text);
});

проверить это: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures#Creating_closures_in_loops_A_common_mistake

0 голосов
/ 18 июня 2019

Сделайте var el_text общедоступной переменной или отправьте данные var el_text на сервер и отправьте их снова с ответом

var el_text = "";
$('.editable').change(function () {
    event.preventDefault();
    el_text = this.lastElementChild;
    var action = this.action;
    var method = this.method;
    var data = $(this).serialize();

    $.ajax({
        url: action,
        type: method,
        data: data,
    }).done(function (resp) {

        // alert('has changed!');
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...