amo Bootstrap-Select
e sto attualmente utilizzando attraverso l'aiuto di una direttiva fatta da un altro utente joaoneto/angular-bootstrap-select
e funziona come previsto, tranne quando si tenta di riempire il mio elemento <select>
con una $http
o in il mio caso è un wrapper dataService
. Mi sembra di avere qualche problema di temporizzazione, i dati arrivano dopo che lo selectpicker
è stato visualizzato/aggiornato e quindi ho finito per avere un elenco di Bootstrap-Select vuoto .. anche se con Firebug, vedo l'elenco dei valori nell'originale <select>
. Se poi vado in console e eseguo manualmente un $('.selectpicker').selectpicker('refresh')
, allora funziona.
Ho funzionato temporaneamente eseguendo una patch e aggiungendo un .selectpicker('refresh')
all'interno di un $timeout
ma come sapete non è ideale dato che stiamo usando jQuery
direttamente in un ngController ... ouch!
Quindi credo che la direttiva probabilmente manchi di un osservatore o almeno qualcosa per far sì che ngModel
venga modificato o aggiornato.
Html codice di esempio:angolare Bootstrap-Select problema di temporizzazione per aggiornare
<div class="col-sm-5">
<select name="language" class="form-control show-tick"
ng-model="vm.profile.language"
selectpicker data-live-search="true"
ng-options="language.value as language.name for language in vm.languages">
</select>
<!-- also tried with an ng-repeat, which has the same effect -->
</div>
poi dentro il mio controller angolare:
// get list of languages from DB
dataService
.getLanguages()
.then(function(data) {
vm.languages = data;
// need a timeout patch to properly refresh the Bootstrap-Select selectpicker
// not so good to use this inside an ngController but it's the only working way I have found
$timeout(function() {
$('.selectpicker, select[selectpicker]').selectpicker('refresh');
}, 1);
});
e qui è la direttiva da parte (joaoneto) su GitHub for Angular-Bootstrap-Select
function selectpickerDirective($parse, $timeout) {
return {
restrict: 'A',
priority: 1000,
link: function (scope, element, attrs) {
function refresh(newVal) {
scope.$applyAsync(function() {
if (attrs.ngOptions && /track by/.test(attrs.ngOptions)) element.val(newVal);
element.selectpicker('refresh');
});
}
attrs.$observe('spTheme', function (val) {
$timeout(function() {
element.data('selectpicker').$button.removeClass(function (i, c) {
return (c.match(/(^|\s)?btn-\S+/g) || []).join(' ');
});
element.selectpicker('setStyle', val);
});
});
$timeout(function() {
element.selectpicker($parse(attrs.selectpicker)());
element.selectpicker('refresh');
});
if (attrs.ngModel) {
scope.$watch(attrs.ngModel, refresh, true);
}
if (attrs.ngDisabled) {
scope.$watch(attrs.ngDisabled, refresh, true);
}
scope.$on('$destroy', function() {
$timeout(function() {
element.selectpicker('destroy');
});
});
}
};
}
Versione AngularJS? – tasseKATT
La versione di AngularJS è 1.3.11 – ghiscoding