From 42c38b29f7dcb3327fe58e630b8e2973676989e0 Mon Sep 17 00:00:00 2001 From: petrovalex Date: Fri, 25 May 2012 23:58:34 +0300 Subject: [PATCH] fix($parser): string concatination with undefined model Closes #988 --- src/ng/parse.js | 10 +++++++++- test/ng/interpolateSpec.js | 26 ++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/ng/parse.js b/src/ng/parse.js index be17e6cafa93..97aba1130364 100644 --- a/src/ng/parse.js +++ b/src/ng/parse.js @@ -5,7 +5,15 @@ var OPERATORS = { 'true':function(){return true;}, 'false':function(){return false;}, undefined:noop, - '+':function(self, locals, a,b){a=a(self, locals); b=b(self, locals); return (isDefined(a)?a:0)+(isDefined(b)?b:0);}, + '+':function(self, locals, a,b){ + a=a(self, locals); b=b(self, locals); + if (isDefined(a)) { + if (isDefined(b)) { + return a + b; + } + return a; + } + return isDefined(b)?b:undefined;}, '-':function(self, locals, a,b){a=a(self, locals); b=b(self, locals); return (isDefined(a)?a:0)-(isDefined(b)?b:0);}, '*':function(self, locals, a,b){return a(self, locals)*b(self, locals);}, '/':function(self, locals, a,b){return a(self, locals)/b(self, locals);}, diff --git a/test/ng/interpolateSpec.js b/test/ng/interpolateSpec.js index a0a3e31100c5..2877f92e83e3 100644 --- a/test/ng/interpolateSpec.js +++ b/test/ng/interpolateSpec.js @@ -15,6 +15,7 @@ describe('$interpolate', function() { it('should suppress falsy objects', inject(function($interpolate) { expect($interpolate('{{undefined}}')()).toEqual(''); + expect($interpolate('{{undefined+undefined}}')()).toEqual(''); expect($interpolate('{{null}}')()).toEqual(''); expect($interpolate('{{a.b}}')()).toEqual(''); })); @@ -55,6 +56,31 @@ describe('$interpolate', function() { })); + it('should ignore undefined model', inject(function($interpolate) { + expect($interpolate("Hello {{'World' + foo}}")()).toEqual('Hello World'); + })); + + + it('should ignore undefined return value', inject(function($interpolate, $rootScope) { + $rootScope.foo = function() {return undefined}; + expect($interpolate("Hello {{'World' + foo()}}")($rootScope)).toEqual('Hello World'); + })); + + + describe('provider', function() { + beforeEach(module(function($interpolateProvider) { + $interpolateProvider.startSymbol('--'); + $interpolateProvider.endSymbol('--'); + })); + + it('should not get confused with same markers', inject(function($interpolate) { + expect($interpolate('---').parts).toEqual(['---']); + expect($interpolate('----')()).toEqual(''); + expect($interpolate('--1--')()).toEqual('1'); + })); + }); + + describe('parseBindings', function() { it('should Parse Text With No Bindings', inject(function($interpolate) { var parts = $interpolate("a").parts;