aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCaitlin Potter2014-02-11 09:57:04 -0500
committerCaitlin Potter2014-02-11 17:08:41 -0500
commitb4eed8ad94ce9719540462c1ee969dfd3c6b2355 (patch)
tree83e7074344a407168b2fa622d49f060ffe956078
parent08793a690abe3eda40deae10f8a0a117779bdbd9 (diff)
downloadangular.js-b4eed8ad94ce9719540462c1ee969dfd3c6b2355.tar.bz2
feat(filterFilter): support deeply nested predicate objects
Due to 339a165, it became impossible to filter nested properties of an object using the filterFilter. A proposed solution to this was to enable the use of nested predicate objects. This change enables the use of these nested predicate objects. Example: ```html <div ng-repeat="it in items | filter:{ address: { country: 'Canuckistan'}}"></div> ``` Or ```js $filter('filter')(items, { address: { country: 'Canuckistan' } }); ``` Closes #6215 Related to #6009
-rw-r--r--src/Angular.js3
-rw-r--r--src/ng/filter/filter.js9
-rw-r--r--test/ng/filter/filterSpec.js11
3 files changed, 22 insertions, 1 deletions
diff --git a/src/Angular.js b/src/Angular.js
index 9811c363..e9d1de88 100644
--- a/src/Angular.js
+++ b/src/Angular.js
@@ -81,6 +81,7 @@
-assertNotHasOwnProperty,
-getter,
-getBlockElements,
+ -hasOwnProperty,
*/
@@ -96,7 +97,7 @@
* @returns {string} Lowercased string.
*/
var lowercase = function(string){return isString(string) ? string.toLowerCase() : string;};
-
+var hasOwnProperty = Object.prototype.hasOwnProperty;
/**
* @ngdoc function
diff --git a/src/ng/filter/filter.js b/src/ng/filter/filter.js
index eabe84a7..2bb0d174 100644
--- a/src/ng/filter/filter.js
+++ b/src/ng/filter/filter.js
@@ -136,6 +136,15 @@ function filterFilter() {
};
} else {
comparator = function(obj, text) {
+ if (obj && text && typeof obj === 'object' && typeof text === 'object') {
+ for (var objKey in obj) {
+ if (objKey.charAt(0) !== '$' && hasOwnProperty.call(obj, objKey) &&
+ comparator(obj[objKey], text[objKey])) {
+ return true;
+ }
+ }
+ return false;
+ }
text = (''+text).toLowerCase();
return (''+obj).toLowerCase().indexOf(text) > -1;
};
diff --git a/test/ng/filter/filterSpec.js b/test/ng/filter/filterSpec.js
index 0bb48704..7679136a 100644
--- a/test/ng/filter/filterSpec.js
+++ b/test/ng/filter/filterSpec.js
@@ -70,6 +70,17 @@ describe('Filter: filter', function() {
});
+ it('should support deep predicate objects', function() {
+ var items = [{person: {name: 'John'}},
+ {person: {name: 'Rita'}},
+ {person: {name: 'Billy'}},
+ {person: {name: 'Joan'}}];
+ expect(filter(items, {person: {name: 'Jo'}}).length).toBe(2);
+ expect(filter(items, {person: {name: 'Jo'}})).toEqual([
+ {person: {name: 'John'}}, {person: {name: 'Joan'}}]);
+ });
+
+
it('should match any properties for given "$" property', function() {
var items = [{first: 'tom', last: 'hevery'},
{first: 'adam', last: 'hevery', alias: 'tom', done: false},