diff options
| -rw-r--r-- | src/Angular.js | 4 | ||||
| -rw-r--r-- | src/formatters.js | 11 | ||||
| -rw-r--r-- | test/testabilityPatch.js | 17 | ||||
| -rw-r--r-- | test/widgetsSpec.js | 38 |
4 files changed, 51 insertions, 19 deletions
diff --git a/src/Angular.js b/src/Angular.js index 3970f762..4c2e3716 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -4,6 +4,8 @@ if (typeof document.getAttribute == 'undefined') document.getAttribute = function() {}; var consoleNode, + NULL = null, + UNDEFIEND = undefined, PRIORITY_FIRST = -99999, PRIORITY_WATCH = -1000, PRIORITY_LAST = 99999, @@ -105,7 +107,7 @@ function jqLiteWrap(element) { } function isUndefined(value){ return typeof value == 'undefined'; } function isDefined(value){ return typeof value != 'undefined'; } -function isObject(value){ return typeof value == 'object';} +function isObject(value){ return value!=null && typeof value == 'object';} function isString(value){ return typeof value == 'string';} function isNumber(value){ return typeof value == 'number';} function isArray(value) { return value instanceof Array; } diff --git a/src/formatters.js b/src/formatters.js index 9122489f..5c8764ac 100644 --- a/src/formatters.js +++ b/src/formatters.js @@ -1,5 +1,7 @@ function formatter(format, parse) {return {'format':format, 'parse':parse || format};} -function toString(obj) {return (isDefined(obj) && obj !== null) ? "" + obj : obj;} +function toString(obj) { + return (isDefined(obj) && obj !== null) ? "" + obj : obj; +} var NUMBER = /^\s*[-+]?\d*(\.\d*)?\s*$/; @@ -7,10 +9,11 @@ angularFormatter.noop = formatter(identity, identity); angularFormatter.json = formatter(toJson, fromJson); angularFormatter['boolean'] = formatter(toString, toBoolean); angularFormatter.number = formatter(toString, function(obj){ - if (isString(obj) && NUMBER.exec(obj)) { - return obj ? 1*obj : null; + if (obj == null || NUMBER.exec(obj)) { + return obj===null || obj === '' ? null : 1*obj; + } else { + throw "Not a number"; } - throw "Not a number"; }); angularFormatter.list = formatter( diff --git a/test/testabilityPatch.js b/test/testabilityPatch.js index e9a88b67..bbe2876e 100644 --- a/test/testabilityPatch.js +++ b/test/testabilityPatch.js @@ -178,9 +178,18 @@ error = noop; function click(element) { element = jqLite(element); - if ( msie && - nodeName(element) == 'INPUT' && (lowercase(element.attr('type')) == 'radio' || lowercase(element.attr('type')) == 'checkbox')) { - element[0].checked = ! element[0].checked; + var type = lowercase(element.attr('type')); + var name = lowercase(nodeName(element)); + if (msie) { + if (name == 'input') { + if (type == 'radio' || type == 'checkbox') { + element[0].checked = ! element[0].checked; + } + } + } + if (name == 'option') { + JQLite.prototype.trigger.call(element.parent(), 'change'); + } else { + JQLite.prototype.trigger.call(element, 'click'); } - JQLite.prototype.trigger.call(element, 'click'); } diff --git a/test/widgetsSpec.js b/test/widgetsSpec.js index ad98e482..9134500a 100644 --- a/test/widgetsSpec.js +++ b/test/widgetsSpec.js @@ -338,17 +338,35 @@ describe("widget", function(){ }); - it('should support type="select-one"', function(){ - compile( - '<select name="selection">' + - '<option>A</option>' + - '<option selected>B</option>' + + describe('select-one', function(){ + it('should initialize to selected', function(){ + compile( + '<select name="selection">' + + '<option>A</option>' + + '<option selected>B</option>' + '</select>'); - expect(scope.selection).toEqual('B'); - scope.selection = 'A'; - scope.$eval(); - expect(scope.selection).toEqual('A'); - expect(element[0].childNodes[0].selected).toEqual(true); + expect(scope.selection).toEqual('B'); + scope.selection = 'A'; + scope.$eval(); + expect(scope.selection).toEqual('A'); + expect(element[0].childNodes[0].selected).toEqual(true); + }); + + it('should honor the value field in option', function(){ + compile( + '<select name="selection" ng:format="number">' + + '<option value="{{$index}}" ng:repeat="name in [\'A\', \'B\']">{{name}}</option>' + + '</select>'); + // childNodes[0] is repeater + expect(scope.selection).toEqual(undefined); + + click(element[0].childNodes[1]); + expect(scope.selection).toEqual(0); + + scope.selection = 1; + scope.$eval(); + expect(element[0].childNodes[2].selected).toEqual(true); + }); }); it('should support type="select-multiple"', function(){ |
