Дросселирование входного сигнала с помощью jquery и lodash

Проблема: использование _.throttle Я теряю способность пройти $(this) к целевой функции.

Я использую JQuery, чтобы посмотреть 3 отдельных input поля.

Я бы хотел, чтобы функция вывода обновляла область вывода, но контролируемым образом ее не нужно обновлять немедленно.

Пример:

$("input").on("change input paste keyup",
    _.throttle( output( $(this).val() )
));

Результат: возникает ошибка jQuery, потому что this не определено

Примечания: Переезд _.throttle() анонимной функции, вызываемой on() просто стреляет output немедленно.

Я пробовал разные настройки, но ни одна из них не сработала. Я чувствую, как будто я пропускаю что-то очень очевидное.

3 ответа

Ответ: Передача ссылки на функцию сохраняет использование this,

пример:

function output() {
  var x = $(this).val();
  $("#output").val(x);
}

// Watch input and throttle calls to output
$("input").on("change input paste keyup", _.throttle(output, 350));
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet" />

<div class="form-group">
  <input class="form-control" placeholder="Type here" />
</div>
<div class="form-group">
  <textarea id="output" rows=4 class="form-control" placeholder="Output here"></textarea>
</div>


<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Источник: я google-fu'd еще немного и нашел ответ в статье, которую я уже просмотрел, но не "прочитал".


@ Michael: К сожалению, ваш код не работает по первому принципу. Вы не можете объявить переменную так, как вы это сделали, в том месте, где вы это сделали.

Я предполагаю, что вы, возможно, хотели сказать либо это:

// this will not work
$("input").on("change input paste keyup",
    self = this,
    // this throws an error
    _.throttle( output( $(self).val() ) )
);

или это:

//This does not work either
$("input").on("change input paste keyup", function(){
    self = this;
    // this still throws an error
    _.throttle( output( $(self).val() ) );
});

Они оба выдают одну и ту же ошибку.

Кэш this

$("input").on("change input paste keyup",
    var self = this;
    _.throttle( output( $(self).val() )
));

Используйте метод bind, чтобы поймать значение, которое вы хотите передать:

$("input").on("change input paste keyup", function() {
  var value = $(this).val();
  var boundOutput = output.bind(this, value);
  _.throttle( boundOutput );
});
Другие вопросы по тегам