在Angular js中按类名过滤匹配的元素
Filter matched elements by class name in Angular js.
问题:
我有一个无序的项目列表,这些项目是从json调用返回的,并使用ng repeat输出。这些项目中的每一个都有一个类名(大约有9个类别(。
我有第二个无序列表,它只是一个可用类别的列表。
目标:
我希望能够在右侧列表中选择一个类别,它将对返回元素的实际列表应用过滤器。这应该通过切换来激活(所以点击一次:过滤,再次点击:删除过滤器(。因此,它只是希望将单击的元素中的类名与json数据列表中共享相同类名的元素相匹配。
我不能使用ng模型(因为这是为某些表单元素保留的(。
对于我的jsfiddle,我只是使用静态html。
这是我的角度代码:
/* angular custom filter on returned ajax api data */
var app = angular.module('app', []);
app.controller('main', function($scope) {
$scope.chFilters = {};
$scope.links = [
{name: 'atm'},
{name: 'internet'},
{name: 'mobile'},
{name: 'sms'},
{name: 'postal'}
];
$scope.channels = ["ATM", "INTERNET", "SMS", "POSTAL","MOBILE"];
});
(这是基于我在SO上发现的另一个问题(。不幸的是,小提琴有点乱,里面有一些无关的代码
HTML:
<div ng-app="app">
<div ng-controller="main">
<ul>
<li class="atm">Some stuff ATM</li>
<li class="internet">Some stuff INTERNET</li>
<li class="sms">Some stuff ATM</li>
<li class="atm">Some stuff ATM</li>
<li class="postal">Some stuff POSTAL</li>
<li class="atm">Some stuff ATM</li>
<li class="internet">Some stuff INTERNET</li>
<li class="postal">Some stuff POSTAL</li>
<li class="postal">Some stuff POSTAL</li>
<li class="atm">Some stuff ATM</li>
<li class="sms">Some stuff SMS</li>
<li class="mobile">Some stuff MOBILE</li>
<li class="internet">Some stuff INTERNET</li>
<li class="mobile">Some stuff MOBILE</li>
</ul>
<ul class="channel-filters">
<li ng-repeat="link in links | filter:chFilters" class="{{link.name | lowercase}}"><a ng-click="chFilters.name = link.name">{{link.name | uppercase}}</a></li>
<li class="last" ng-click="chFilters.name = ''">CLEAR FILTER</li>
</ul>
<ul>
<li ng-repeat="channel in channels | filter:chFilters">
<strong>{{channel}}</strong>
<a ng-click="chFilters = channel">{{channel}}</a>
</li>
</ul>
<!-- original -->
<ul>
<li ng-repeat="link in links | filter:chFilters">
<strong>{{link.name}}</strong>
<a ng-click="chFilters.name = link.name">{{link.name}}</a>
</li>
</ul>
</div>
</div>
这是来自应用程序的实际HTML(带有对api的调用(。
<ul class="accordion">
<li class="search-text-channel">
<input type="textarea" ng-model="searchTextChannel.$" placeholder="Search"/>
</li>
<li ng-repeat="day in interactions.model.byDay | filter:searchTextChannel" ng-click="hidden = !hidden" ng-init="hidden = false" class="{{day.channel | removeSpace | lowercase}}" ng-class="{'closed': !hidden, 'open': hidden}">
<span class="date">{{day.date}}</span>
<span class="subheading">{{day.channel}}</span>
<ul ng-show="hidden">
<li ng-repeat="interaction in day.interactions">
{{interaction.time}} {{interaction.description | removeUnderscore}}
</li>
</ul>
</li>
<li class="load-more">
<a href="" ng-click="interactions.loadMore()"><i class="fa fa-plus"></i>LOAD MORE</a>
</li>
</ul>
我已经设法在jquery中重新创建了这个功能,但我认为在有角度的应用程序中实现有角度的解决方案会更好。
我尝试过研究,也尝试过实现显示/隐藏以及自定义过滤器,但到目前为止没有什么乐趣。
这是我的(凌乱的(jsfiddle
<ul>
<li ng-repeat="channel in channels | filter:chFilters.name">
<strong>{{channel}}</strong>
<a ng-click="chFilters = channel">{{channel}}</a>
</li>
</ul>
<!-- original -->
<ul>
<li ng-repeat="link in links | filter:chFilters.name">
<strong>{{link.name}}</strong>
<a ng-click="chFilters.name = link.name">{{link.name}}</a>
</li>
</ul>
更新Plunker
如果你对此有任何疑问,请告诉我。
以下是解决方案的一部分:
假设你的物品是这样的:
$scope.items = [
{ class: "atm", label: "Some stuff ATM" },
{ class: "internet", label: "Some stuff INTERNET" },
{ class: "sms", label: "Some stuff SMS" },
{ class: "postal", label: "Some stuff POSTAL" },
...
];
显示过滤列表(目前仅通过单个通道过滤(:在范围中创建一个单独的列表,并应用过滤器:
$scope.click = function(name) {
$scope.chFilters.name = name;
$scope.filteredItems = $scope.items.filter(function(item) {
return item.class === $scope.chFilters.name;
});
};
从底部列表调用此点击处理程序:
...<a ng-click="click(link.name)">{{link.name | uppercase}}</a>....
并在顶部列表中显示filteredItems
:
<ul>
<li ng-repeat="item in filteredItems" ng-class="item.class">{{item.label}}</li>
</ul>
因此,这实际上只是一个起点,它应该扩展到处理多个过滤器等。
相关文章:
- jQuery只过滤可见元素
- 在 Android WebView 中过滤 DOM 元素,而无需 jQuery
- JSON 填充的表单元素不使用 angularJs 过滤器进行过滤
- Angular:如何根据模型中过滤的元素数量隐藏DOM元素
- 过滤具有2个选择列表的元素
- 使用 lodash 过滤一个数组的元素与另一个数组的元素
- 如何将数组添加到对象中,但为每个数组元素过滤掉除一列之外的所有列
- Knockoutjs 模板:在通过某些属性过滤该数组后,如何将 1 个对象数组用于 2 个 DOM 元素
- jQuery .not() 没有从函数 - Ideas 中过滤元素
- 使用 jQuery 过滤元素
- 使用JavaScript中的过滤元素属性创建对象
- Angularjs-我们如何观察ngRepeat中的动态元素,以及动态ng模型名称和ANY更改时的过滤元素值
- 通过data= attribute过滤元素
- 如何在jQuery中使用单选按钮过滤元素
- Jquery过滤元素类
- jQuery |过滤元素
- jQuery过滤元素,如果类不存在,则添加类;s是第一个元素
- 如何根据类型过滤元素(<选择>)
- 如何使用 Firebase 按元素的子值过滤元素
- 捕获按键以过滤元素