Я люблю Bootstrap-Select
и я в настоящее время использовать его через помощью директивы, сделанного другим пользователем joaoneto/angular-bootstrap-select
, и она работает как задумано, за исключением, когда я пытаюсь заполнить мой <select>
элемент с $http
или в мой случай a dataService
обертка. Я, кажется, получаю некоторую проблему с синхронизацией, данные появляются после того, как selectpicker
получил отображение/обновление, а затем у меня есть пустой список Bootstrap-Select. Хотя с Firebug я вижу список значений в скрытом теперь <select>
. Если я затем зашел в консоль и вручную выполнил $('.selectpicker').selectpicker('refresh')
, тогда он будет работать.
Я получил его временно, выполнив патч и добавив .selectpicker('refresh')
внутри $timeout
, но, как вы знаете, он не идеален, так как мы используем jQuery
прямо в ngController ... ouch!
Так что я считаю, что в директиве, возможно, отсутствует наблюдатель или, по крайней мере, что-то, что может вызвать изменение или обновление ngModel
.
Html код образца:Угловая Bootstrap-Выберите вопрос времени, чтобы обновить
<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>
затем внутри моего углового контроллера:
// 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);
});
и вот директива сформулированное (joaoneto) на 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');
});
});
}
};
}
AngularJS версия? – tasseKATT
Версия AngularJS 1.3.11 – ghiscoding