Этот объект не определен внутри обратного вызова, имеющего параметр, в jquery - PullRequest
0 голосов
/ 08 мая 2019

Я прикрепляю функцию обратного вызова для выбора поля для изменения события, подобного этому

select.on('change', config, party.selectOne);

Здесь config - это параметр, который я передаю функции обратного вызова. Внутри обратного вызова я мог получить доступ к параметру config .

Но моя проблема в обратном вызове: $ (this) возвращает неожиданный объект, отличный от объекта select box

party.selectOne= function(config) {
    // is the selectbox
    var selectbox = $(this);
    var api = selectbox.data('api');
}

Итак, я получаю api как undefined . Но это будет работать нормально, если я не передам параметр для обратного вызова Что со мной не так?

Пример:

<select data-api="{'name':'one','address':'address1'}">
    <option>one</option>
    <option>two</option>
</select>

Ответы [ 3 ]

0 голосов
/ 08 мая 2019

Не this не определено, но возвращаемое значение data() для «api» равно.
Используйте attr() вместо data():

// To make this example work
var party = {};
var config = { foo: "bar" };
var select = $("select");
// ---

party.selectOne = function(config) {
    var selectbox = $(this);
    var api = selectbox.attr('data-api');
    
    console.log(api);
    console.log(config.data.foo);
}

select.on('change', config, party.selectOne);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<select data-api="{'name':'one','address':'address1'}">
<option>one</option>
<option>two</option>
</select>
0 голосов
/ 09 мая 2019

Разрешено.Здесь параметр config имел тип Object.Если мы передадим параметр config в виде строки, он будет разрешен.Я думаю, если мы передадим config как object , $ (this) будет ссылаться на config , вместо ссылки select box element

0 голосов
/ 08 мая 2019

Итак, я получаю api как неопределенное.

Это означает, что эти две вещи верны:

  1. Элемент change произошло (один из элементов в select на момент вашего вызова select.on) никогда не вызывал .data('api', something), и

  2. Этот элемент не имеетатрибут data-api для него - или, скорее, он не использовался с first time .data.

Или, это может означать, что party.selectOne был связан в некоторый момент кода, который вы не показывали.

(Помните, что data - это , а не аксессор для data-* атрибутов. Это больше и меньше, чем .)

jQuery, основанный на множестве, может сбить вас с толку.Если у вас есть несколько элементов в select на момент вызова select.on, и вы только установили элемент данных api (напрямую через .data или косвенно через атрибут data-api) на one из них, затем событие change для другого одного из них может дать undefined для .data('api').Кэш данных jQuery для каждого элемента, а не для набора.

...