Używam Twittera Typeahead.js w podskładniku w Ember, którym zasilam funkcję dataSource (patrz poniżej). Ta funkcja źródła danych wysyła zapytanie do zdalnego serwera. To zapytanie chciałbym opublikować w Ember, który wydaje się nie działać.Ember.run.debounce nie odrzuca
Czy to ma związek z runloopem? Cokolwiek powinienem zawinąć?
import Ember from 'ember';
export default Ember.Component.extend({
dataResponse: [],
dataSource: function() {
var component = this;
// function given to typeahead.js
return function (query, cb) {
var requestFunc = function() {
var encQuery = encodeURIComponent(query);
Ember.$.getJSON('/api/autocompletion?prefix=' + encQuery).then(function (result) {
// save results
component.set('dataResponse', result.autocompletion);
// map results
var mappedResult = Ember.$.map(result.autocompletion, function (item) {
return { value: item };
});
cb(mappedResult);
});
};
// this is not debounced, why? :|
Ember.run.debounce(this, requestFunc, 500); // debounce by 500ms
};
}.property()
});
Uwaga: Nie używam Bloodhound z Typeahead.js, ponieważ potrzebuję dostępu do wyników. Niestandardowe rozwiązanie wydawało się na początku łatwiejsze.
Dzięki za komentarz. To nie działa, kiedy przekazuję "komponent" jako kontekst. Pomyślałem, że to zadziała, ponieważ odniesienie do komponentu się nie zmieni. Ale też nie działa. Masz pomysł, jak to działa? – deepflame
"Przekazujesz inną funkcję za każdym razem, gdy wywołujesz odbijanie". Musisz przejść w tej samej instancji (tej) i tej samej funkcji, twoja funkcja jest inna za każdym razem, gdy jest wywoływana. – Kingpin2k
Tak, na początku miałem problemy, aby uzyskać moją głowę wokół wydobywania funkcji, ale zrobiłem to teraz, jak w drugiej odpowiedzi i działa. Dzięki jeszcze raz – deepflame