diff --git a/src/ng/parse.js b/src/ng/parse.js index 043be76c880c..bd3aa048df44 100644 --- a/src/ng/parse.js +++ b/src/ng/parse.js @@ -55,7 +55,7 @@ function ensureSafeObject(obj, fullExpression) { 'Referencing the Window in Angular expressions is disallowed! Expression: {0}', fullExpression); } else if (// isElement(obj) - obj.children && (obj.nodeName || (obj.on && obj.find))) { + obj.children && (obj.nodeName || (obj.prop && obj.attr && obj.find))) { throw $parseMinErr('isecdom', 'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}', fullExpression); diff --git a/test/ng/parseSpec.js b/test/ng/parseSpec.js index 24f5c95098dc..466be755d523 100644 --- a/test/ng/parseSpec.js +++ b/test/ng/parseSpec.js @@ -786,6 +786,28 @@ describe('parser', function() { '$parse', 'isecdom', 'Referencing DOM nodes in Angular expressions is ' + 'disallowed! Expression: a.b.doc.on("click")'); })); + + // Issue #4805 + it('should NOT throw isecdom when referencing a Backbone Collection', function() { + // Backbone stuff is sort of hard to mock, if you have a better way of doing this, + // please fix this. + var fakeBackboneCollection = { + children: [{}, {}, {}], + find: function() {}, + on: function() {}, + off: function() {}, + bind: function() {} + }; + scope.backbone = fakeBackboneCollection; + expect(function() { scope.$eval('backbone'); }).not.toThrow(); + }); + + it('should NOT throw isecdom when referencing an array with node properties', function() { + var array = [1,2,3]; + array.on = array.attr = array.prop = array.bind = true; + scope.array = array; + expect(function() { scope.$eval('array'); }).not.toThrow(); + }); }); });