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