#angularjs #twitter-bootstrap #angularjs-directive
#angularjs #twitter-bootstrap #angularjs-директива
Вопрос:
Он работает для статического выпадающего списка, но при его применении для динамической загрузки данных с помощью angularjs selectpicker был применен, но данные не загружены. если я удалил эту директиву из выпадающего списка, то данные загружаются идеально, в чем проблема? Я пробовал больше…
Примечание: метод, созданный с использованием with class so, не вызывает проблем в этом
bootselectpicker: function() {
return {
restrict: "A",
require: "ngModel",
link: function(scope, element, attrs, ctrl) {
element.selectpicker();
}
}
}
<select id="special-size" bootselectpicker ng-model="items.selectSize" ng-options="size.key as size.value for size in products.sizes" ng-change="sizeChange('size',items.selectSize)" class="selectpicker size-droplist">
<option value="">Select Size</option>
</select>
Ответ №1:
Вам нужно дождаться загрузки DOM, поскольку SelectPicker создается на основе <option>
-элементов внутри вашего <select>
элемента. Если ng-options еще не создан, в нем нет <option>
-elements и, следовательно, SelectPicker пуст.
Вы инициализируете SelectPicker после того, как DOM будет готов, используя $timeout от Angular без задержки. Без задержки $ timeout просто ожидает, пока DOM не будет готов, а затем запускает обратный вызов.
Вот так:
link: function(scope, element, attrs, ctrl) {
$timeout(function() {
element.selectpicker();
});
}
Кроме того, если ваш файл products.sizes
обновлен, вам придется запускать вручную, element.selectpicker('refresh')
поскольку SelectPicker не прослушивает изменения в <option>
файлах.
Комментарии:
1. Если кому-то понравилось использовать selectpicker и angularjs, просто перейдите к select2 select2.org как я и делал, и это работает безупречно, обновляет DOM, и select2 знает об этом и обновляет соответственно, никакого дополнительного кода для обработки вещей.
2. кто-нибудь может захотеть проверить это, работает идеально: embed.plnkr.co/NV6Vk0AtzJ25tQldgsJx
Ответ №2:
решение этой проблемы заключается в следующем:
Определение выбора следующим образом:
<select class="selectpicker" data-live-search="true" ng-model="id">
<option class="small-font" selected value='any'>Anyone</option>
<option class="small-font" ng-repeat="member in List" data-select-watcher data-last="{{$last}}" value="{{member.id}}">{{member.name}}</option>
</select>
и директива selectWatcher:
app.directive('selectWatcher', function ($timeout) {
return {
link: function (scope, element, attr) {
var last = attr.last;
if (last === "true") {
$timeout(function () {
$(element).parent().selectpicker('val', 'any');
$(element).parent().selectpicker('refresh');
});
}
}
};
});
Что он делает, так это определяет, когда был добавлен последний параметр в выборе, а затем выбирает параметр по умолчанию и обновляет.
Комментарии:
1. Это создает зависание браузера, если мы используем длинный выпадающий список типа country
Ответ №3:
setTimeout(function () {
$('.selectpicker').selectpicker('refresh');
},1000)
Вызовите эту функцию, когда вы создаете свой массив для ng-repeat или ng-options
Ответ №4:
попробуйте эту директиву
.directive('selectPicker', ['$parse', function ($parse) {
return {
restrict: 'A',
require: '?ngModel',
priority: 10,
compile: function (tElement, tAttrs, transclude) {
tElement.selectpicker($parse(tAttrs.selectpicker)());
tElement.selectpicker('refresh');
return function (scope, element, attrs, ngModel) {
if (!ngModel) return;
scope.$watch(attrs.ngModel, function (newVal, oldVal) {
scope.$evalAsync(function () {
if (!attrs.ngOptions || /track by/.test(attrs.ngOptions)) element.val(newVal);
element.selectpicker('refresh');
});
});
ngModel.$render = function () {
scope.$evalAsync(function () {
element.selectpicker('refresh');
});
}
};
}
};
}])
this is the html
<select class="form-control with-search " select-picker data-live-search="true" title="Select Consumer" ng-model="selectedConsumer" ng-options="c.id as c.firstName ' ' c.lastName for c in consumers">
</select>