我正在尝试在我的应用程序的元素中动态插入一个ng-options
指令<select>
,这些元素都有自己的类名和其他指令(比如ng-if
等等)。
<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
)。我试图在compile
指令的步骤中进行 DOM 修改,但$scope.items
变得未知,甚至没有填充下拉菜单。