在我的模型中,我的数据类似于:
$scope.list = [{id:0,tags:['tag1','tag2']},{id:2,tags:['tag2']}};
我想显示带有复选框的标签列表(包含’tag1’和’tag2’的唯一值)。希望是这样的:
<div ng-repeat="tag in list.tags"> <label class="checkbox"> <input type="checkbox" ng-model="filter.tag" /> {{tag}} </label> </div>
如果我对列表进行硬编码,我知道如何根据检查的内容过滤主列表,但是不知道如何自动生成唯一标签列表。
您正在寻找执行三个操作:
$scope.list
您可以使用纯JavaScript来做到这一点,但是为了使事情变得更容易,我建议您使用Underscore(一个使您可以访问许多用于处理和检查数组,对象等的函数的库)。
让我们从下面的代码开始:
$scope.list = [ {id: 0, tags: ['tag1', 'tag2']}, {id: 1, tags: ['tag2']}, {id: 2, tags: ['tag1', 'tag3', 'tag4']}, {id: 3, tags: ['tag3', 'tag4']} ];
现在,让我们执行第一个操作:从中的tags属性为每个对象获取数组$scope.list。Underscore提供了pluck我们所需要的方法。
tags
pluck
采摘 _.pluck(list, propertyName) 地图的最常见用例的便捷版本:提取属性值列表。
采摘 _.pluck(list, propertyName)
_.pluck(list, propertyName)
地图的最常见用例的便捷版本:提取属性值列表。
使用pluck,我们可以获得以下信息:
var tags = _.pluck($scope.list, 'tags'); // gives us [['tag1', 'tag2'], ['tag2'], ['tag1', 'tag3', 'tag4'], ['tag3', 'tag4']]
现在,我们要展平该数组。
展平 _.flatten(array, [shallow]) 展平嵌套数组(嵌套可以达到任何深度)。如果通过浅层,则阵列将仅展平一个级别。
展平 _.flatten(array, [shallow])
_.flatten(array, [shallow])
展平嵌套数组(嵌套可以达到任何深度)。如果通过浅层,则阵列将仅展平一个级别。
tags = _.flatten(tags); // gives us ['tag1', 'tag2', 'tag2', 'tag1', 'tag3', 'tag4', 'tag3', 'tag4']
最后,您只需要每个标签的一个实例。
uniq _.uniq(array, [isSorted], [iterator])别名:unique 生成数组的无重复版本,使用===来测试对象是否相等。如果您事先知道该数组已排序,则为isSorted传递true将运行更快的算法。如果要基于转换计算唯一项,请传递迭代器函数。
uniq _.uniq(array, [isSorted], [iterator])别名:unique
_.uniq(array, [isSorted], [iterator])
unique
生成数组的无重复版本,使用===来测试对象是否相等。如果您事先知道该数组已排序,则为isSorted传递true将运行更快的算法。如果要基于转换计算唯一项,请传递迭代器函数。
tags = _.unique(tags) // gives us ['tag1', 'tag2', 'tag3', 'tag4']
我们可以将它们与Underscore的有用chain方法结合在一起,以将它们链接在一起。让我们在返回唯一标记的范围内创建一个函数:
chain
$scope.uniqueTags = function() { return _.chain($scope.list) .pluck('tags') .flatten() .unique() .value(); };
由于这是一个函数,因此无论我们在$scope.list事后添加还是删除项,它都将始终返回唯一标签。
现在,您可以使用ng-repeaton uniqueTags显示每个标签:
ng-repeat
uniqueTags
<div ng-repeat="tag in uniqueTags()"> <label class="checkbox"> <input type="checkbox" ng-model="filter.tag" /> {{tag}} </label> </div>
这是演示此技术的有效jsFiddle:http : //jsfiddle.net/BinaryMuse/cqTKG/