Я пытаюсь передать функцию Vue методу дроссельной заслонки lodash. Разве я не могу просто сделать что-то подобное?
Когда я пытаюсь сделать это, я получаю следующую ошибку:
Ошибка в обратном вызове для "запроса" наблюдателя: "TypeError: ожидается функция"
наблюдатель
watch: {
query() {
throttle(this.autocomplete(), 400);
}
}
методы
methods: {
autocomplete() {}
}
Несмотря на то, что я передаю ссылку на функцию, я все еще получаю сообщение об ошибке. Если я оберну его анонимной функцией, он не будет срабатывать:
throttle(() => { this.autocomplete(); }, 400);
Я только что проверил, и функция autocomplete
действительно срабатывает, независимо от ошибки, что она не является функцией в моем примере вверху.
Что здесь происходит?
Редактировать:
Jsfiddle: http://jsfiddle.net/yMv7y/2780/
Вы передаете возвращаемое значение this.autocomplete()
(возможно, undefined
), а не ссылку на функцию. Если вы хотите сделать последнее, вы должны опустить скобки:
watch: {
query() {
throttle(this.autocomplete, 400);
}
}
Я предполагаю, что вам нужно определить дросселированную функцию с не вызываемым обратным вызовом в переменной, а затем вызвать это как функцию:
var throttled = throttle(this.autocomplete, 400)
watch: {
query() {
throttled();
}
}
Просто потратил довольно долго, пытаясь понять, что один из них...
Рабочий подход:
var demo = new Vue({
el: '#demo',
data: {
query: ''
},
watch: {
query: function() {
this.autocomplete()
}
},
methods: {
autocomplete: _.throttle(function() {
console.log('test');
}, 50)
}
})
<script src="http://vuejs.org/js/vue.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
<div id="demo" v-cloak>
<input type="text" v-model="query">
</div>
Как заметил @Bill Criswell,
Это создает функцию дросселирования при каждом изменении запроса. Вы хотите постоянно называть ту же дроссельную функцию, что и ответ ниже.
console.log
.throttle
?