我正在尝试multiple使用ui-select指令根据某个属性的值将属性添加到ng- attr-指令。不幸的是,这对我不起作用。我设置了一个简单的示例来演示正在发生的事情。
multiple
ui-select
ng- attr-
柱塞示例
在阅读了Angular Repo中提到的GitHubIssue之后,我终于明白了。
您需要使用更高的指令设置priority一个terminal属性,并将其属性设置为true(在编译我们的指令后,跳过所有其他指令的编译)。然后在postLink函数中,我们将编译整个元素本身。但是在此之前,我们需要删除自己的指令(无限循环!)。
priority
terminal
postLink
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); } }; } }; });
<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
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" } } } } })
<body ng-controller="DemoCtrl"> <multi-select-checker> </multi-select-checker> </body>
<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>
<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方法呈现了两个单独的输入字段。
而且单选情况似乎已被破坏(通过删除了multiple指令)-这也位于您的初始Plnkr中。
在此处查看工作的Plnkr:http ://plnkr.co/edit/T9e5tcAkcQLsDV3plfEl?p=preview