Я пытаюсь добавить атрибут multiple
в директиву ui-select
на основе значения определенного свойства с помощью директивы ng-attr-
. К сожалению, это не работает для меня. Я настроил пример плунжера, чтобы продемонстрировать, что происходит.
Условно добавьте множественный атрибут в ui-select
Ответы (2)
Редактировать
Я наконец получил его после прочтения упомянутой GitHub Issue в угловое репо.
Вам нужно настроить директиву с более высоким значением priority
и атрибутом terminal
, установленным в значение true (что пропускает компиляцию всех других директив после компиляции нашей директивы). Затем в функции postLink
мы скомпилируем весь элемент целиком. Но перед этим нужно удалить нашу собственную директиву (бесконечный цикл!).
Большие выстрелы в Добавить директивы из директивы в AngularJS
Код директивы
angular.module('app')
.directive('multiSelectChecker', function ($compile) {
return {
restrict: 'A',
replace: false,
terminal: true, //terminal means: compile this directive only
priority: 50000, //priority means: the higher the priority, the "firster" the directive will be compiled
compile: function compile(element, attrs) {
element.removeAttr("multi-select-checker"); //remove the attribute to avoid indefinite loop
element.removeAttr("data-multi-select-checker"); //also remove the same attribute with data- prefix in case users specify data-multi-select-checker in the html
return {
pre: function preLink(scope, iElement, iAttrs, controller) { },
post: function postLink(scope, iElement, iAttrs, controller) {
if(scope.options.Multiple == true) {
iElement[0].setAttribute('multiple',''); //set the multiple directive, doing it the JS way, not jqLite way.
}
$compile(iElement)(scope);
}
};
}
};
});
HTML-код
<ui-select ng-model="model.choice" multi-select-checker>
<ui-select-match>{{$item.Title}}</ui-select-match>
<ui-select-choices repeat="item.Id as item in options.SuggestedValues | filter: { Title: $select.search }">
<div ng-bind="item.Title | highlight: $select.search"></div>
</ui-select-choices>
</ui-select>
Рабочий план:
http://plnkr.co/edit/N11hjOFaEkFUoIyeWqzc?p=preview
Оригинальный ответ (тоже рабочий, но с повторяющимся кодом)
Я сделал следующее:
- Создал директиву упаковки под названием
multi-select-checker
- В этой директиве проверьте, является ли
options.Multiple
истинным или ложным - Возвращайте два разных URL-адреса шаблона для каждого случая. Случай 1): вернуть single-select.tpl.html или Случай 2): вернуть mutli-select.tpl.html (который включает директиву «несколько».
Код директивы:
app.directive('multiSelectChecker', function() {
return {
template: '<ng-include src="getTemplateUrl()"/>',
controller: function($scope) {
$scope.getTemplateUrl = function() {
if($scope.options.Multiple == true) {
console.log("multi-select");
return "multi-select.tpl.html"
}
else {
console.log("single select");
return "single-select.tpl.html"
}
}
}
}
})
Использование в HTML:
<body ng-controller="DemoCtrl">
<multi-select-checker>
</multi-select-checker>
</body>
Шаблон 1: одиночный выбор
<ui-select ng-model="model.choice">
<ui-select-match>{{$item.Title}}</ui-select-match>
<ui-select-choices repeat="item.Id as item in options.SuggestedValues | filter: { Title: $select.search }">
<div ng-bind="item.Title | highlight: $select.search"></div>
</ui-select-choices>
</ui-select>
Шаблон 2: множественный выбор
<ui-select ng-model="model.choice" multiple>
<ui-select-match>{{$item.Title}}</ui-select-match>
<ui-select-choices repeat="item.Id as item in options.SuggestedValues | filter: { Title: $select.search }">
<div ng-bind="item.Title | highlight: $select.search"></div>
</ui-select-choices>
</ui-select>
Как видите, два шаблона отличаются только одной директивой: «несколько». Может быть, есть лучшие решения.
Я даже не могу понять, почему подход ng-attr-multiple не работает.
Кроме того, я понял, что есть два отдельных поля ввода, отображаемых с помощью подхода ng-attr-multiple.
И случай единственного выбора, кажется, нарушен (путем удаления множественной директивы), который также был в вашем первоначальном Plnkr.
Рабочий код
См. рабочий Plnkr здесь: http://plnkr.co/edit/T9e5tcAkcQLsDV3plfEl?p=preview< /а>
ng-attr
. Спасибо, в любом случае :)
- person Kassem; 07.08.2015
ui-select
-›, что уменьшит ваш повторяющийся код.
- person ilmgb; 07.08.2015
$parent
. Благодарю вас!
- person Jens Bodal; 01.12.2016
return theme + (angular.isDefined(tAttrs.multiple) ? '/select-multiple.tpl.html' : '/select.tpl.html');
- person Exlord; 21.02.2018
Это то, чего вы хотите достичь:
<body ng-controller="DemoCtrl">
This works perfectly well:
<ui-select ng-model="model.choice" multiple>
<ui-select-match>{{$item.Title}}</ui-select-match>
<ui-select-choices repeat="item.Id as item in options.SuggestedValues | filter: { Title: $select.search }">
<div ng-bind="item.Title | highlight: $select.search"></div>
</ui-select-choices>
</ui-select>
<br />
<br />
This does not work:
<ui-select ng-model="model.choice2" multiple="{{options.Multiple}}">
<ui-select-match>{{$item.Title}}</ui-select-match>
<ui-select-choices repeat="item.Id as item in options.SuggestedValues | filter: { Title: $select.search }">
<div ng-bind="item.Title | highlight: $select.search"></div>
</ui-select-choices>
</ui-select>
</body>