доступ к значению $ (this) возвращает неопределенное значение jquery - PullRequest
4 голосов
/ 21 января 2020

Я пытаюсь получить доступ к $(this) внутри инициализации select2, но он возвращает undefined.

$(".tags").each(function() {
    var placeholder = "Select Email";
    if($(this).attr('name') === 'names[]')
        placeholder = "Select Name";
    $(this).select2({
        tags: true,
        placeholder: placeholder,
        language: {
            noResults: function () {
                return 'Type and enter to add new';
            },
        },
        escapeMarkup: function (markup) {
            return markup;
        },
        createTag: function(params) {
            console.log($(this).attr('name')); // returns undefined
            if (params.term.indexOf('@') === -1)
                return null;
            return {
                id: params.term,
                text: params.term
            }
        }
    })
});

select2() инициализируется для каждого .tags. Мне нужно получить доступ к $(this) внутри инициализации здесь.

Как я могу это сделать?

Ответы [ 2 ]

6 голосов
/ 21 января 2020

Вы можете удерживать ссылку на $(this) перед вызовом select2()

$(".tags").each(function() {
    var placeholder = "Select Email";
    var $that = $(this);


    if($that.attr('name') === 'names[]')
        placeholder = "Select Name";
    $that.select2({
        tags: true,
        placeholder: placeholder,
        language: {
            noResults: function () {
                return 'Type and enter to add new';
            },
        },
        escapeMarkup: function (markup) {
            return markup;
        },
        createTag: function(params) {
            console.log($that.attr('name'));
            if (params.term.indexOf('@') === -1)
                return null;
            return {
                id: params.term,
                text: params.term
            }
        }
    })
});

Надеюсь, это поможет

4 голосов
/ 21 января 2020

Проблема заключается в том, что функция createTag не выполняется в области действия элемента, для которого был создан экземпляр select2.

Чтобы исправить это, вам необходимо сохранить ссылку на исходный элемент, что можно сделать, сохранив его в переменной в обработчике each():

$(".tags").each(function() {
  var $tag = $(this);

  // other logic...

  $tag.select2({
    // other logic...
    createTag: function(params) {
      console.log($tag.prop('name'));

      if (params.term.indexOf('@') === -1)
        return null;

      return {
        id: params.term,
        text: params.term
      }
    }
  })
});
...