ngRepeat按深度属性过滤
如果我有一个复杂的对象作为属性值的对象,我怎么能过滤一个嵌套的属性?
这可以用OOB ng-repeatfilter来完成吗?
数据
{ Name: 'John Smith', Manager: { id: 123, Name: 'Bill Lumburg' } }
ngRepeat
<li ng-repeat="e in emps | filter:Manager.Name">{{ e.Name }}</li>
你需要传递参数来过滤:
<input ng-model="filter.key"> <ul> <li ng-repeat="e in list | filter: {Manager: {Name: filter.key}}"> {{e.Name}} (Manager: {{e.Manager.Name}}) </li> </ul>
例子在Plunker
如果你正在过滤多个属性,那么语法将类似于下面。
<ul> <li ng-repeat="item in list | {filter: top_object_property_name: value, top_object_property_with_nested_objects_name: {nested_object_property_name: value}}"> ... </li> </ul>
例如:
var employees = [name: 'John', roles: [{roleName: 'Manager'},{roleName: 'Supervisor'}]]; <li ng-repeat="staff in employees | {filter: name: 'John', roles: {roleName: 'Manager'}}"> ... </li>
要筛选多个深度属性,我们需要创build自定义筛选器。 我的意思是我们需要创build自己的函数来过滤对象中的数据并返回所需的对象(过滤对象)。
例如,我需要从下面的对象过滤数据 –
[ { "document":{ "documentid":"1", "documenttitle":"test 1", "documentdescription":"abcdef" } }, { "document":{ "documentid":"2", "documenttitle":"dfjhkjhf", "documentdescription":"dfhjshfjdhsj" } } ]
在HTML中,我们使用ng-repeat来显示文档列表 –
<div> //search input textbox <input ng-model="searchDocument" placeholder="Search"> </div> <div ng-repeat="document in documentList | filter: filteredDocument"> //our html code </div>
在控制器中,我们使用“documenttitle”和“documentdescription”这两个对象的属性来编写filter函数来返回过滤对象,代码示例如下:
function filterDocuments(document) { if($scope.searchDocument) { if(document.documentTitle.toLowerCase().indexOf($scope.searchDocument.toLowerCase()) !== -1 || document.document.shortDescription.toLowerCase().indexOf($scope.searchDocument.toLowerCase()) !== -1) { //returns filtered object return document } }else { return document; } }
其中$ scope.searchDocument是绑定到search文本框(HTMLinput标签)的范围variables,用户可以在其中input要search的文本。
在默认情况下实现的最新版本的angularjs嵌套objfilter。通常使用filter。