aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/Angular.js4
-rw-r--r--src/formatters.js11
-rw-r--r--test/testabilityPatch.js17
-rw-r--r--test/widgetsSpec.js38
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(){