使用 AngularJS 指令从选择中删除重复项
Remove duplicates from select using AngularJS directive
我正在构建一个事件应用程序,该应用程序使用Drupal中的JSON在AngularJS中显示事件(在Drupal模块内)。JSON 对象键之一是"流派",我在选择下拉列表中使用它,以便用户可以按流派过滤事件。
我已经尝试了 ng-option 和 ng-repeat 方法来填充选择,我发现只有 ng-repeat 有效,但当然它会为具有特定类型的事件的每个实例添加一个选项 - 所以如果我有两个音乐事件,我会在选择中得到两个音乐选项。所以现在我正在尝试删除重复项。
我已经尝试了ui.unique,但这删除了除一个选项之外的所有选项,而不是重复项。我也尝试过自定义过滤器,但遇到了类似的问题。我认为数据或 AngularJS 应用程序的结构很奇怪,所以最好尝试一个指令,但我没有 JQuery 迷路了,需要帮助!我愿意接受任何建议。
杰伦
{"nodes":[
{"node":{
"title":"The Awesome Band",
"date":"2015-03-14T00:00:00+00:00",
"venue":"The Place",
"image":{
"src":"/images/band.jpg",
"alt":"The Awesome Band at The Place"
},
"time":"8pm",
"taxonomy":"Rock",
"genre":"Music Event"
}
}]}
.JS
var weekEvents = angular.module('weekEvents',[]);
jQuery(document).ready(function(){
angular.bootstrap(document.getElementById('weekEvents-app'), ['weekEvents']);
});
var weekEventsController = function($scope, $http){
$http.get('/json/next7days').success(function(result){
$scope.weekEvents = (function(){
return result.nodes;
})();
});
};
weekEvents.directive('genreSelect', function(){
return{
restrict: "AE",
link:function(scope, elem, attrs){
elem.slice.call(elem.options)
.map(function(a){
if(this[a.value]){
elem.removeChild(a);
} else {
this[a.value]=1;
}
},{});
}
}
});
.HTML
<div id="weekEvents-app">
<div class="col-md-8 col-sm-8" ng-controller="weekEventsController">
<h2>This week</h2>
<select ng-model="showGenre" name="genreSelect" data-genre-select>
<option value="All" selected>All</option>
<option ng-repeat="event in weekEvents" value="{{event.node.genre}}">{{event.node.genre}}</option>
</select>
<div class="mainEventItem" ng-repeat="event in weekEvents | orderBy:sortOrder | filter:showGenre">
<main-item-container>
<div class="mainItem" ng-click="expandItem()">
<img src="{{event.node.image.src}}" alt="{{event.node.image.alt}}" class="img-responsive mainItemImg"/>
<div class="mainItemDetails">
<h2 class="eventTitle">{{event.node.title}}</h2>
<p class="eventDate">{{event.node.date | date: 'EEEE'}} / {{event.node.field_time}} / {{event.node.venue}}</p>
</div>
<div class="animate-show mainItemDesc lightLink" ng-show='!collapsed'>
<p><strong>{{event.node.venue}} | {{event.node.cost}}</strong></p>
<p>{{event.node.description}}</p>
<a ng-href="{{event.node.Path}}">MORE</a>
</div>
</main-item-container>
</div>
</div>
</div>
一种简单的方法,可能不是最有效的,特别是对于大数组,但你明白了:
$scope.getWeekEventsGenres = function() {
return $scope.weekEvents.map(function (event) {
return event.node.genre;
})
//maybe sort?
.sort()
//remove duplicates
.filter(function(item, pos) {
return a.indexOf(item) == pos;
});
}
<option ng-repeat="event in getWeekEventsGenres()" ...>...</option>
相关文章:
- 如何使用 jQuery 删除选择标记中的多个选项
- 原型JS不删除选择元素
- 删除选择中的选项
- jQuery按索引从类中删除/选择元素
- 当给定一个数组(仅限纯Javascript)时,删除选择(多个)选项的最简单方法是什么
- 删除选择选项中的几个文本
- 使用 jQuery 添加/删除选择
- YUI - 删除选择选项
- 使用href-jquery动态删除选择选项值
- 如何删除选择字段中的列表选项项
- 使用jquery删除选择框中的选择
- 从列表javascript中删除选择值
- 如何在不删除选择框滚动条的情况下删除浏览器滚动条
- Knockout:当已在使用时,从数组中删除选择选项
- 尝试使用jQuery remove()函数删除选择框
- 如何删除选择标签的所有选项,并在javascript中分配一个新的项目列表来选择选项
- 删除选择框中除了first和selected之外的所有选项
- 如何删除“选择”下拉框中的选项
- 删除选择标签中的空白项
- 删除选择选项的方法并非在所有浏览器(JavaScript)中都有效