2017-06-07 3 views
0

Vue関数をlodash throttleメソッドに渡そうとしています。私はちょうどこれのような何かをすることができるべきではありませんか?vueでlodashにメソッドを渡すと、 'Expected a function'が返されます

私は、私は次のエラーを取得していますこれを行うにしようとしています:

Error in callback for watcher "query": "TypeError: Expected a function"

ウォッチャー

watch: { 
    query() { 
     throttle(this.autocomplete(), 400); 
    } 
} 

方法

methods: { 
    autocomplete() {} 
} 

私は、私は、関数の参照を渡していたとしても依然としてエラーメッセージが表示されます。私は無名関数でそれをラップした場合には発生しません:

throttle(() => { this.autocomplete(); }, 400); 

私はちょうどチェックしautocomplete機能は、実際にそれが一番上に私の例では関数ではないことに関係なく、エラーの火災に思えるん。

ここで何が問題になりますか?

編集:

Jsfiddle:http://jsfiddle.net/yMv7y/2780/

+0

...ただ、うち1つを理解しようとかなりしばらく過ごし

var throttled = throttle(this.autocomplete, 400) watch: { query() { throttled(); } }

:ヘクタール変数にコールバックを非呼び出され、その後、関数とそのを呼び出します、 'this.autocomplete'は' undefined'を返します。参照を取得するには、 'this。$ options.methods.autocomplete'を実行します。推奨されているかわからない場合しかしそれをした後でさえ、それは 'オートコンプリート'メソッドを呼び出さなかった。機能を通過してもスロットルが機能しませんでした。例[here](http://jsfiddle.net/yMv7y/2783/)を参照してください。また、フィドルには別の解決策があります。 – Pradeepb

答えて

2

あなたは戻りthis.autocomplete()の値(多分undefined)およびない関数参照を渡しています。あなたが後者を行いたい場合は、括弧を省略することがあります。

watch: { 
    query() { 
     throttle(this.autocomplete, 400); 
    } 
} 
+0

私はこれを試しましたが、何も起こりません、私のオートコンプリートは起動しません。 'console.log'のようなものでもありません。 –

+0

@ Stephan-v多分コードを追加する必要があります。 'スロットル'とは何ですか? – str

+0

スロットルは私がインポートしたlodash関数です:https://lodash.com/docs/4.17.4#throttle –

1

作業するアプローチを:

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クリスウェルがコメントしたよう、

This is creating a throttled function every time query changes. You want to constantly call the same throttled function like the answer below.

1

私の推測では、スロットル機能を定義する必要があります@strが言ったように

関連する問題