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'; | 
