Sto cercando di ottenere i bootstrap UI angolari typeahead che funzionano con una risorsa REST che ho impostato. Ma non sono sicuro di come farlo funzionare con la sua natura asincrona.
Al momento ho adattato l'esempio fornito da Angular UI Bootstrap.
quindi il mio html sembra così, chiamando getLibs() per ottenere l'elenco per il menu a discesa typeahead.
<div class='container-fluid' ng-controller="TypeaheadCtrl">
<pre>Model: {{selected| json}}</pre>
<input type="text" typeahead="lib.name for lib in getLibs($viewValue)" active='active' ng-model="selected" typeahead-min-length='3' >
</div>
la mia risorsa si presenta in questo modo:
angular.module('LibraryLookupService', ['ngResource']).factory('Library',
function($resource){
return $resource( "../../api/seq/library/?name__icontains=:searchStr" , {} ,
{ 'get': {method:'GET'},
'query': {method:'GET', params: {} , isArray:false },
}
)
}
);
mio controller sembra così (sto indovinando è qui che sto facendo qualcosa di sbagliato):
function TypeaheadCtrl($scope , Library){
$scope.selected = undefined;
$scope.active = undefined ;
$scope.libs = [{name:'initial'} , {name:"values"}];
$scope.getLibs = function(viewValue){
console.log("value:", viewValue);
if (viewValue.length > 3) {
var return_vals = Library.query({searchStr:viewValue}, function() {
$scope.libs = return_vals.objects ;
console.log("here", $scope.libs) ;
}) ;
}
return $scope.libs
}
}
Quindi se ho capito bene, il menu typeahead viene popolato dal valore di ritorno delle getLibs () funzione. Quando viene chiamato getLibs() sta interrogando l'interfaccia REST, ma inizialmente viene restituito un valore vuoto. Questo viene popolato dalla funzione fornita al metodo Library.query() e ciò viene eseguito dopo che i dati sono stati restituiti dalla richiesta REST.
Ciò significa in sostanza che il menu viene aggiornato con una pressione di un tasto più tardi rispetto a quella che desidero. Scrivo "3456" e viene popolato con i risultati di una query "345" nell'interfaccia REST.
Come si ottiene il menu da aggiornare quando la risposta viene restituita dalla funzione Library.query()? Sto andando su questo correttamente?
In realtà si potrebbe semplicemente restituire il $ promise senza il metodo then() in quanto è ridondante. – mameluc
Non capisco perché si passi l'oggetto persona quando si chiama PersonService poiché non vedo un oggetto Persona nella definizione di fabbrica. – peztherez