Я пытаюсь динамически вставить директиву ng-options
внутри <select>
элементов в моем приложении, которые имеют свои собственные имена классов и другие директивы (например, ng-if
и т. Д.).Директива Dynamic AngularJS
<div ng-app="app" ng-controller="ctrl">
<select ng-model="model" class="myClass" ng-if="condition || true" my-directive>
</select>
<pre>{{ model | json }}</pre>
</div>
angular
.module('app', [])
.directive('myDirective', function($compile) {
return {
restrict: 'A',
scope: false,
link: function($scope, $elem, $attr) {
$scope.items = [{ label: "foo", value: "foofoo"},
{ label: "bar", value: "barbar"}];
$elem.removeAttr('my-directive'); // Prevents infinite loop
$elem.attr('ng-options', 'item as item.label for item in items');
$compile($elem)($scope);
}
}
})
.controller('ctrl', function($scope) {
$scope.model = null;
$scope.$watch('model', function(val) { console.log('•', val) });
});
Идея заключается в том, что my-directive
следует заменить ng-options
и элемент должен по-прежнему ведут себя как обычно со всеми другими директивами, которые применяются к нему.
Я не понимаю, почему ng-model
не обновляется, так как область действия директивы является родительской областью (scope: false
). Я попытался внести изменения DOM в этап compile
директивы, но $scope.items
неизвестен, а выпадающее меню даже не заселено.
Я был занят компиляции ответ, когда вы бьете меня к нему. Только один вопрос, почему вам нужна директива 'ng-if =" || true "', чтобы заставить ее работать? Посмотрите первый пример, где присутствует условие «ng-if =» условие || true ". Затем во втором примере условие «ng-if =» || true "' отсутствует, а опции 'select' не заполняются. 1. https://jsfiddle.net/vg2wgamg/ 2. https://jsfiddle.net/2qzjkpqL/ Я всегда могу задать вопрос и позволить вам ответить на него там? –
@TjaartvanderWalt Это действительно сложная проблема. Я не совсем понимаю, что вызывает это поведение, однако он связан с дополнительной вложенной областью, созданной ngIf. Решение, которое я нашел, заключается в том, чтобы добавить команду 'terminal: true', чтобы предотвратить дальнейшую компиляцию (?). Я также обнаружил, что необходимо вручную скомпилировать элемент в функции ссылок. Проверьте обновленную демоверсию. – dfsq
Хорошо. Я тестировал, и ваш предыдущий пример работал нормально, как и в функции компиляции директивы. Я не думаю, что вам нужно вручную использовать службу '$ compile', как это было в вашем обновленном примере кода –