aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ng/interpolate.js26
-rw-r--r--test/BinderSpec.js2
-rw-r--r--test/ng/interpolateSpec.js23
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';