more tests passing

This commit is contained in:
Misko Hevery 2010-03-30 15:39:51 -07:00
parent a7d62dcb55
commit b5b8f63e1e
5 changed files with 17 additions and 23 deletions

View file

@ -5,6 +5,8 @@ if (!window['console']) window['console']={'log':noop, 'error':noop};
var consoleNode, var consoleNode,
NOOP = 'noop', NOOP = 'noop',
NG_ERROR = 'ng-error',
NG_VALIDATION_ERROR = 'ng-validation-error',
jQuery = window['jQuery'] || window['$'], // weirdness to make IE happy jQuery = window['jQuery'] || window['$'], // weirdness to make IE happy
_ = window['_'], _ = window['_'],
jqLite = jQuery || jqLiteWrap, jqLite = jQuery || jqLiteWrap,
@ -226,12 +228,12 @@ function escapeHtml(html) {
replace(/>/g, '>'); replace(/>/g, '>');
} }
function elementDecorateError(element, error) { function elementError(element, type, error) {
if (error) { if (error) {
element.addClass(NG_VALIDATION_ERROR); element.addClass(type);
element.attr(NG_ERROR, error); element.attr(NG_ERROR, error);
} else { } else {
element.removeClass(NG_VALIDATION_ERROR); element.removeClass(type);
element.removeAttr(NG_ERROR); element.removeAttr(NG_ERROR);
} }
} }

View file

@ -77,14 +77,11 @@ function isRenderableElement(element) {
} }
function rethrow(e) { throw e; } function rethrow(e) { throw e; }
function errorHandlerFor(element) { function errorHandlerFor(element, error) {
while (!isRenderableElement(element)) { while (!isRenderableElement(element)) {
element = element.parent() || jqLite(document.body); element = element.parent() || jqLite(document.body);
} }
return function(error) { elementError(element, 'ng-exception', isDefined(error) ? toJson(error) : error);
element.attr('ng-error', angular.toJson(error));
element.addClass('ng-exception');
};
} }
function createScope(parent, Class) { function createScope(parent, Class) {
@ -125,17 +122,13 @@ function createScope(parent, Class) {
$tryEval: function (expression, exceptionHandler) { $tryEval: function (expression, exceptionHandler) {
try { try {
var value = expressionCompile(expression).apply(instance, slice.call(arguments, 2, arguments.length)); return expressionCompile(expression).apply(instance, slice.call(arguments, 2, arguments.length));
if (exceptionHandler) {
errorHandlerFor(exceptionHandler)();
}
return value;
} catch (e) { } catch (e) {
error(e); error(e);
if (isFunction(exceptionHandler)) { if (isFunction(exceptionHandler)) {
exceptionHandler(e); exceptionHandler(e);
} else if (exceptionHandler) { } else if (exceptionHandler) {
errorHandlerFor(exceptionHandler)(e); errorHandlerFor(exceptionHandler, e);
} }
} }
}, },

View file

@ -99,7 +99,7 @@ foreach({
if (cache.state[cache.lastKey] !== null) { if (cache.state[cache.lastKey] !== null) {
element.removeClass('ng-input-indicator-wait'); element.removeClass('ng-input-indicator-wait');
} }
elementDecorateError(element, error); elementError(element, NG_VALIDATION_ERROR, error);
}); });
} }

View file

@ -28,7 +28,7 @@ function valueAccessor(scope, element) {
function validate(value) { function validate(value) {
var error = required && !trim(value) ? "Required" : validator({self:scope, scope:{get:scope.$get, set:scope.$set}}, value); var error = required && !trim(value) ? "Required" : validator({self:scope, scope:{get:scope.$get, set:scope.$set}}, value);
if (error !== lastError) { if (error !== lastError) {
elementDecorateError(element, error); elementError(element, NG_VALIDATION_ERROR, error);
lastError = error; lastError = error;
} }
return value; return value;
@ -85,9 +85,7 @@ function optionsAccessor(scope, element) {
function noopAccessor() { return { get: noop, set: noop }; } function noopAccessor() { return { get: noop, set: noop }; }
var NG_ERROR = 'ng-error', var textWidget = inputWidget('keyup change', modelAccessor, valueAccessor, ''),
NG_VALIDATION_ERROR = 'ng-validation-error',
textWidget = inputWidget('keyup change', modelAccessor, valueAccessor, ''),
buttonWidget = inputWidget('click', noopAccessor, noopAccessor, undefined), buttonWidget = inputWidget('click', noopAccessor, noopAccessor, undefined),
INPUT_TYPE = { INPUT_TYPE = {
'text': textWidget, 'text': textWidget,

View file

@ -552,10 +552,11 @@ BinderTest.prototype.testActionOnAHrefThrowsError = function(){
assertEquals({a:"abc", b:2}, fromJson(input.attr('ng-error'))); assertEquals({a:"abc", b:2}, fromJson(input.attr('ng-error')));
assertTrue("should have an error class", input.hasClass('ng-exception')); assertTrue("should have an error class", input.hasClass('ng-exception'));
c.scope.action = noop; // TODO: I think that exception should never get cleared so this portion of test makes no sense
input.click(); // c.scope.action = noop;
dump(input.attr('ng-error')); // input.click();
assertFalse('error class should be cleared', input.hasClass('ng-exception')); // dump(input.attr('ng-error'));
// assertFalse('error class should be cleared', input.hasClass('ng-exception'));
}; };
BinderTest.prototype.testShoulIgnoreVbNonBindable = function(){ BinderTest.prototype.testShoulIgnoreVbNonBindable = function(){