2014-11-25 13 views
5

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.

Odpowiedz

5

Wstrzymywanie polega na tworzeniu unikalnego klucza na podstawie kontekstu/funkcji. Gdy wywołasz go później, porównuje istniejące klucze z przekazanym kluczem kontekstowym/funkcyjnym. Za każdym razem, gdy wywołujesz debounce, przekazujesz inną funkcję, dlatego nie działa ona w oczekiwany sposób.

+0

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

+0

"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

+0

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

1

Biorąc porady od @ Kingpin2k I refactored kod tak:

import Ember from 'ember'; 

export default Ember.Component.extend({ 

    dataResponse: [], 
    dataSource: function() { 
     var component = this; 

     var queryString = null; 
     var callBack = null; 
     var requestFunc = function() { 
      var encQuery = encodeURIComponent(queryString); 
      Ember.$.getJSON('/api/autocompletion?prefix=' + encQuery).then(function (result) { 
       // save results 
       component.set('dataResponse', result.autocompletion); 
       var mappedResult = Ember.$.map(result.autocompletion, function (item) { 
        return { value: item }; 
       }); 
       callBack(mappedResult); 
      }); 
     }; 

     // function used for typeahead 
     return function (q, cb) { 
      queryString = q; 
      callBack = cb; 
      Ember.run.debounce(this, requestFunc, 500); // debounce by 500ms 
     }; 
    }.property() 

}); 
Powiązane problemy