diff options
| -rw-r--r-- | src/ng/interpolate.js | 26 | ||||
| -rw-r--r-- | test/BinderSpec.js | 2 | ||||
| -rw-r--r-- | test/ng/interpolateSpec.js | 23 |
3 files changed, 40 insertions, 11 deletions
diff --git a/src/ng/interpolate.js b/src/ng/interpolate.js index 149f0c86..dcf05d77 100644 --- a/src/ng/interpolate.js +++ b/src/ng/interpolate.js @@ -52,7 +52,7 @@ function $InterpolateProvider() { }; - this.$get = ['$parse', function($parse) { + this.$get = ['$parse', '$exceptionHandler', function($parse, $exceptionHandler) { var startSymbolLength = startSymbol.length, endSymbolLength = endSymbol.length; @@ -124,18 +124,24 @@ function $InterpolateProvider() { if (!mustHaveExpression || hasInterpolation) { concat.length = length; fn = function(context) { - for(var i = 0, ii = length, part; i<ii; i++) { - if (typeof (part = parts[i]) == 'function') { - part = part(context); - if (part == null || part == undefined) { - part = ''; - } else if (typeof part != 'string') { - part = toJson(part); + try { + for(var i = 0, ii = length, part; i<ii; i++) { + if (typeof (part = parts[i]) == 'function') { + part = part(context); + if (part == null || part == undefined) { + part = ''; + } else if (typeof part != 'string') { + part = toJson(part); + } } + concat[i] = part; } - concat[i] = part; + return concat.join(''); + } + catch(err) { + var newErr = new Error('Error while interpolating: ' + text + '\n' + err.toString()); + $exceptionHandler(newErr); } - return concat.join(''); }; fn.exp = text; fn.parts = parts; diff --git a/test/BinderSpec.js b/test/BinderSpec.js index 6d5dd91e..ba90539f 100644 --- a/test/BinderSpec.js +++ b/test/BinderSpec.js @@ -175,7 +175,7 @@ describe('Binder', function() { $rootScope.error['throw'] = function() {throw 'MyError';}; errorLogs.length = 0; $rootScope.$apply(); - expect(errorLogs.shift()).toBe('MyError'); + expect(errorLogs.shift().message).toBe('Error while interpolating: {{error.throw()}}\nMyError'); $rootScope.error['throw'] = function() {return 'ok';}; $rootScope.$apply(); diff --git a/test/ng/interpolateSpec.js b/test/ng/interpolateSpec.js index 20214445..a0a3e311 100644 --- a/test/ng/interpolateSpec.js +++ b/test/ng/interpolateSpec.js @@ -25,6 +25,29 @@ describe('$interpolate', function() { expect($interpolate('{{ false }}')()).toEqual('false'); })); + it('should rethrow exceptions', inject(function($interpolate, $rootScope) { + $rootScope.err = function () { + throw new Error('oops'); + }; + expect(function () { + $interpolate('{{err()}}')($rootScope); + }).toThrow('Error while interpolating: {{err()}}\nError: oops'); + })); + + it('should stop interpolation when encountering an exception', inject(function($interpolate, $compile, $rootScope) { + $rootScope.err = function () { + throw new Error('oops'); + }; + var dom = jqLite('<div>{{1 + 1}}</div><div>{{err()}}</div><div>{{1 + 2}}</div>'); + $compile(dom)($rootScope); + expect(function () { + $rootScope.$apply(); + }).toThrow('Error while interpolating: {{err()}}\nError: oops'); + expect(dom[0].innerHTML).toEqual('2'); + expect(dom[1].innerHTML).toEqual('{{err()}}'); + expect(dom[2].innerHTML).toEqual('{{1 + 2}}'); + })); + it('should return interpolation function', inject(function($interpolate, $rootScope) { $rootScope.name = 'Misko'; |
