Javascript 按角度显示的一组复选框控制显示的项目
我有一个映射到复选框的标记列表。在同一控制器中,有一个包含这些标记的项目列表。具有选中标记的项目应可见 使用代码设置。我不知道如何通过活动(选中)标记过滤Javascript 按角度显示的一组复选框控制显示的项目,javascript,angularjs,Javascript,Angularjs,我有一个映射到复选框的标记列表。在同一控制器中,有一个包含这些标记的项目列表。具有选中标记的项目应可见 使用代码设置。我不知道如何通过活动(选中)标记过滤$scope.items。我尝试了两种不同的方法,但由于对角度非常陌生,我需要朝着正确的方向推动。我认为$scope.items应该观察$scope.tags,并通过每个tag的活动属性进行过滤。签出 在模块中定义自定义筛选器: angular .module('myApp', []) .filter('withActiveTags',
$scope.items
。我尝试了两种不同的方法,但由于对角度非常陌生,我需要朝着正确的方向推动。我认为$scope.items
应该观察$scope.tags
,并通过每个tag的活动属性进行过滤。签出
在模块中定义自定义筛选器:
angular
.module('myApp', [])
.filter('withActiveTags', ActiveTagsFilter)
.controller('TestController', TestController);
function ActiveTagsFilter() {
return function (items, tags) {
var filteredItems = [];
angular.forEach(items, function (item) {
if (/* tags contains an active tag that's in item.tags */) {
filteredItems.push(item);
}
});
return filteredItems;
};
}
function TestController() {
// controller stuff
}
然后在你的观点中写下这样的话:
<ul>
<li ng-repeat="item in items | withActiveTags:tags">{{ item.name }}</li>
</ul>
- {{{item.name}
现在,只要找出进行过滤的最佳方法,就可以了。下面是一个减去过滤的示例。我确实创建了一个“示例过滤器”,以演示过滤器是否工作。您也可以使用常规功能,在此处实现:
视图更改:
<li ng-repeat="item in items | filter:tagSelected">
控制器更改:
$scope.tagSelected = function(item) {
for(var i = 0, l = $scope.tags.length; i < l; i++) {
var t = $scope.tags[i];
for(var j = 0, k = item.tags.length; j < k; j++) {
if(item.tags[j] == t.name && t.active) {
return true;
}
}
}
return false;
};
$scope.tagSelected=函数(项){
对于(var i=0,l=$scope.tags.length;i
或位不同的解决方案
谢谢我自己也对这个问题进行了一些尝试,并得出了这个解决方案。如果我再也不会在其他地方重复使用这种类型的过滤器,那么这个解决方案就足够了。谢谢。我不知道如何将实际的标记传递给自定义筛选函数(在html中)。考虑到我可能会在其他地方重复使用相同的过滤机制,我认为这个解决方案是最好的。你能更具体一点吗?链接断了吗?是否有不起作用的功能?请注意,plunker并没有解决原始问题,它只演示了如何创建可重用的自定义过滤器。感谢plunkr。这似乎与@nwayne的答案相似,同样适用。
<li ng-repeat="item in items | selectedTags : tags ">
.filter('selectedTags', function() {
return function(items, tags) {
var filtered = [];
tags.forEach(function(tag) {
if (tag.active === true) {
items.forEach(function(item) {
{
if (item.tags.indexOf(tag.name) > -1) {
if (filtered.indexOf(item) == -1) {
filtered.push(item);
}
}
}
})
}
});
return filtered;
};
})