diff options
| -rw-r--r-- | css/angular.css | 11 | ||||
| -rw-r--r-- | src/Angular.js | 32 | ||||
| -rw-r--r-- | src/directives.js | 66 | ||||
| -rw-r--r-- | test/BinderSpec.js | 14 |
4 files changed, 25 insertions, 98 deletions
diff --git a/css/angular.css b/css/angular.css index aadd0a31..89519da6 100644 --- a/css/angular.css +++ b/css/angular.css @@ -8,17 +8,6 @@ color: red; } -.ng-exception { - border: 2px solid #FF0000; - font-family: "Courier New", Courier, monospace; - font-size: smaller; - white-space: pre; -} - -.ng-validation-error { - border: 2px solid #FF0000; -} - /***************** * indicators *****************/ diff --git a/src/Angular.js b/src/Angular.js index 407fc263..caa51a06 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -71,8 +71,6 @@ var _undefined = undefined, $value = 'value', $selected = 'selected', $undefined = 'undefined', - NG_EXCEPTION = 'ng-exception', - NG_VALIDATION_ERROR = 'ng-validation-error', NOOP = 'noop', Error = window.Error, /** holds major version number for IE or NaN for real browsers */ @@ -758,36 +756,6 @@ function setHtml(node, html) { } } -function isRenderableElement(element) { - var name = element && element[0] && element[0].nodeName; - return name && name.charAt(0) != '#' && - !includes(['TR', 'COL', 'COLGROUP', 'TBODY', 'THEAD', 'TFOOT'], name); -} - -function elementError(element, type, error) { - var parent; - - while (!isRenderableElement(element)) { - parent = element.parent(); - if (parent.length) { - element = element.parent(); - } else { - return; - } - } - - if (element[0]['$NG_ERROR'] !== error) { - element[0]['$NG_ERROR'] = error; - if (error) { - element.addClass(type); - element.attr(type, error.message || error); - } else { - element.removeClass(type); - element.removeAttr(type); - } - } -} - function concat(array1, array2, index) { return array1.concat(slice.call(array2, index)); } diff --git a/src/directives.js b/src/directives.js index ca9fe4fc..dd67ddc7 100644 --- a/src/directives.js +++ b/src/directives.js @@ -216,19 +216,39 @@ angularDirective("ng:bind", function(expression, element){ element.addClass('ng-binding'); var exprFn = parser(expression).statements(); return function(element) { - var lastValue = noop, lastError = noop; + var lastValue = Number.NaN; this.$watch(function(scope) { // TODO(misko): remove error handling https://github.com/angular/angular.js/issues/347 - var error, value, html, isHtml, isDomElement, + var value, html, isHtml, isDomElement, hadOwnElement = scope.hasOwnProperty('$element'), oldElement = scope.$element; // TODO(misko): get rid of $element https://github.com/angular/angular.js/issues/348 scope.$element = element; try { value = exprFn(scope); + // If we are HTML than save the raw HTML data so that we don't recompute sanitization since + // it is expensive. + // TODO(misko): turn this into a more generic way to compute this + if ((isHtml = (value instanceof HTML))) + value = (html = value).html; + if (lastValue === value) return; + isDomElement = isElement(value); + if (!isHtml && !isDomElement && isObject(value)) { + value = toJson(value, true); + } + if (value != lastValue) { + lastValue = value; + if (isHtml) { + element.html(html.get()); + } else if (isDomElement) { + element.html(''); + element.append(value); + } else { + element.text(value == undefined ? '' : value); + } + } } catch (e) { scope.$service('$exceptionHandler')(e); - error = formatError(e); } finally { if (hadOwnElement) { scope.$element = oldElement; @@ -236,30 +256,6 @@ angularDirective("ng:bind", function(expression, element){ delete scope.$element; } } - // If we are HTML, then save the raw HTML data so that we don't - // recompute sanitization since that is expensive. - // TODO: turn this into a more generic way to compute this - if ((isHtml = (value instanceof HTML))) - value = (html = value).html; - if (lastValue === value && lastError == error) return; - isDomElement = isElement(value); - if (!isHtml && !isDomElement && isObject(value)) { - value = toJson(value, true); - } - if (value != lastValue || error != lastError) { - lastValue = value; - lastError = error; - elementError(element, NG_EXCEPTION, error); - if (error) value = error; - if (isHtml) { - element.html(html.get()); - } else if (isDomElement) { - element.html(''); - element.append(value); - } else { - element.text(value == undefined ? '' : value); - } - } }); }; }); @@ -272,20 +268,8 @@ function compileBindTemplate(template){ forEach(parseBindings(template), function(text){ var exp = binding(text); bindings.push(exp - ? function(scope, element) { - var error, value; - try { - value = scope.$eval(exp); - } catch(e) { - scope.$service('$exceptionHandler')(e); - error = toJson(e); - } - elementError(element, NG_EXCEPTION, error); - return error ? error : value; - } - : function() { - return text; - }); + ? function(scope, element) { return scope.$eval(exp); } + : function() { return text; }); }); bindTemplateCache[template] = fn = function(scope, element, prettyPrintJson) { var parts = [], diff --git a/test/BinderSpec.js b/test/BinderSpec.js index 93f23eef..224c449f 100644 --- a/test/BinderSpec.js +++ b/test/BinderSpec.js @@ -270,39 +270,25 @@ describe('Binder', function(){ it('IfTextBindingThrowsErrorDecorateTheSpan', function(){ var scope = this.compile('<div>{{error.throw()}}</div>', null, true); - var doc = scope.$element; var errorLogs = scope.$service('$exceptionHandler').errors; scope.error = { 'throw': function(){throw "ErrorMsg1";} }; scope.$apply(); - var span = childNode(doc, 0); - assertTrue(span.hasClass('ng-exception')); - assertTrue(!!span.text().match(/ErrorMsg1/)); - assertTrue(!!span.attr('ng-exception').match(/ErrorMsg1/)); - assertEquals(['ErrorMsg1'], errorLogs.shift()); scope.error['throw'] = function(){throw "MyError";}; errorLogs.length = 0; scope.$apply(); - span = childNode(doc, 0); - assertTrue(span.hasClass('ng-exception')); - assertTrue(span.text(), span.text().match('MyError') !== null); - assertEquals('MyError', span.attr('ng-exception')); assertEquals(['MyError'], errorLogs.shift()); scope.error['throw'] = function(){return "ok";}; scope.$apply(); - assertFalse(span.hasClass('ng-exception')); - assertEquals('ok', span.text()); - assertEquals(null, span.attr('ng-exception')); assertEquals(0, errorLogs.length); }); it('IfAttrBindingThrowsErrorDecorateTheAttribute', function(){ var scope = this.compile('<div attr="before {{error.throw()}} after"></div>', null, true); - var doc = scope.$element; var errorLogs = scope.$service('$exceptionHandler').errors; var count = 0; |
