angular.js/src/API.js

326 lines
9.4 KiB
JavaScript
Raw Normal View History

2010-01-12 00:15:12 +00:00
var angularGlobal = {
'typeOf':function(obj){
2010-01-12 00:15:12 +00:00
if (obj === null) return "null";
2010-01-06 00:36:58 +00:00
var type = typeof obj;
2010-01-12 00:15:12 +00:00
if (type == "object") {
2010-01-06 00:36:58 +00:00
if (obj instanceof Array) return "array";
if (obj instanceof Date) return "date";
if (obj.nodeType == 1) return "element";
}
return type;
}
};
2010-01-12 00:15:12 +00:00
var angularCollection = {};
var angularObject = {};
var angularArray = {
'includeIf':function(array, value, condition) {
2010-01-06 00:36:58 +00:00
var index = _.indexOf(array, value);
if (condition) {
if (index == -1)
array.push(value);
} else {
array.splice(index, 1);
}
return array;
},
'sum':function(array, expression) {
var fn = angular['Function']['compile'](expression);
2010-01-06 00:36:58 +00:00
var sum = 0;
for (var i = 0; i < array.length; i++) {
var value = 1 * fn(array[i]);
if (!isNaN(value)){
sum += value;
}
}
return sum;
},
'remove':function(array, value) {
2010-01-06 00:36:58 +00:00
var index = _.indexOf(array, value);
if (index >=0)
array.splice(index, 1);
return value;
},
'find':function(array, condition, defaultValue) {
2010-01-06 00:36:58 +00:00
if (!condition) return undefined;
var fn = angular['Function']['compile'](condition);
2010-01-06 00:36:58 +00:00
_.detect(array, function($){
if (fn($)){
defaultValue = $;
return true;
}
});
return defaultValue;
},
'findById':function(array, id) {
2010-01-06 00:36:58 +00:00
return angular.Array.find(array, function($){return $.$id == id;}, null);
},
'filter':function(array, expression) {
2010-01-06 00:36:58 +00:00
var predicates = [];
predicates.check = function(value) {
for (var j = 0; j < predicates.length; j++) {
if(!predicates[j](value)) {
return false;
}
}
return true;
};
2010-01-09 23:02:43 +00:00
var getter = Scope.getter;
2010-01-06 00:36:58 +00:00
var search = function(obj, text){
if (text.charAt(0) === '!') {
return !search(obj, text.substr(1));
}
switch (typeof obj) {
case "boolean":
case "number":
case "string":
return ('' + obj).toLowerCase().indexOf(text) > -1;
case "object":
for ( var objKey in obj) {
if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) {
return true;
}
}
return false;
case "array":
for ( var i = 0; i < obj.length; i++) {
if (search(obj[i], text)) {
return true;
}
}
return false;
default:
return false;
}
};
switch (typeof expression) {
case "boolean":
case "number":
case "string":
expression = {$:expression};
case "object":
for (var key in expression) {
if (key == '$') {
(function(){
var text = (''+expression[key]).toLowerCase();
if (!text) return;
predicates.push(function(value) {
return search(value, text);
});
})();
} else {
(function(){
var path = key;
var text = (''+expression[key]).toLowerCase();
if (!text) return;
predicates.push(function(value) {
return search(getter(value, path), text);
});
})();
}
}
break;
case "function":
predicates.push(expression);
break;
default:
return array;
}
var filtered = [];
for ( var j = 0; j < array.length; j++) {
var value = array[j];
if (predicates.check(value)) {
filtered.push(value);
}
}
return filtered;
},
'add':function(array, value) {
2010-01-06 00:36:58 +00:00
array.push(_.isUndefined(value)? {} : value);
return array;
},
'count':function(array, condition) {
2010-01-06 00:36:58 +00:00
if (!condition) return array.length;
var fn = angular['Function']['compile'](condition);
2010-01-06 00:36:58 +00:00
return _.reduce(array, 0, function(count, $){return count + (fn($)?1:0);});
},
'orderBy':function(array, expression, descend) {
2010-01-06 00:36:58 +00:00
function reverse(comp, descending) {
2010-01-09 23:02:43 +00:00
return toBoolean(descending) ?
2010-01-06 00:36:58 +00:00
function(a,b){return comp(b,a);} : comp;
}
function compare(v1, v2){
var t1 = typeof v1;
var t2 = typeof v2;
if (t1 == t2) {
if (t1 == "string") v1 = v1.toLowerCase();
if (t1 == "string") v2 = v2.toLowerCase();
if (v1 === v2) return 0;
return v1 < v2 ? -1 : 1;
} else {
return t1 < t2 ? -1 : 1;
}
}
expression = _.isArray(expression) ? expression: [expression];
expression = _.map(expression, function($){
var descending = false;
if (typeof $ == "string" && ($.charAt(0) == '+' || $.charAt(0) == '-')) {
descending = $.charAt(0) == '-';
$ = $.substring(1);
}
var get = $ ? angular['Function']['compile']($) : _.identity;
2010-01-06 00:36:58 +00:00
return reverse(function(a,b){
return compare(get(a),get(b));
}, descending);
});
var comparator = function(o1, o2){
for ( var i = 0; i < expression.length; i++) {
var comp = expression[i](o1, o2);
2010-01-12 00:15:12 +00:00
if (comp !== 0) return comp;
2010-01-06 00:36:58 +00:00
}
return 0;
};
return _.clone(array).sort(reverse(comparator, descend));
},
'orderByToggle':function(predicate, attribute) {
2010-01-06 00:36:58 +00:00
var STRIP = /^([+|-])?(.*)/;
var ascending = false;
var index = -1;
_.detect(predicate, function($, i){
if ($ == attribute) {
ascending = true;
index = i;
return true;
}
if (($.charAt(0)=='+'||$.charAt(0)=='-') && $.substring(1) == attribute) {
ascending = $.charAt(0) == '+';
index = i;
return true;
2010-01-12 00:15:12 +00:00
}
2010-01-06 00:36:58 +00:00
});
if (index >= 0) {
predicate.splice(index, 1);
}
predicate.unshift((ascending ? "-" : "+") + attribute);
return predicate;
},
'orderByDirection':function(predicate, attribute, ascend, descend) {
2010-01-06 00:36:58 +00:00
ascend = ascend || 'ng-ascend';
descend = descend || 'ng-descend';
var att = predicate[0] || '';
var direction = true;
if (att.charAt(0) == '-') {
att = att.substring(1);
direction = false;
} else if(att.charAt(0) == '+') {
att = att.substring(1);
}
return att == attribute ? (direction ? ascend : descend) : "";
},
'merge':function(array, index, mergeValue) {
2010-01-06 00:36:58 +00:00
var value = array[index];
if (!value) {
value = {};
array[index] = value;
}
2010-01-09 23:02:43 +00:00
merge(mergeValue, value);
2010-01-06 00:36:58 +00:00
return array;
}
};
2010-01-12 00:15:12 +00:00
var angularString = {
'quote':function(string) {
2010-01-06 00:36:58 +00:00
return '"' + string.replace(/\\/g, '\\\\').
replace(/"/g, '\\"').
replace(/\n/g, '\\n').
replace(/\f/g, '\\f').
replace(/\r/g, '\\r').
replace(/\t/g, '\\t').
replace(/\v/g, '\\v') +
'"';
},
'quoteUnicode':function(string) {
var str = angular['String']['quote'](string);
2010-01-06 00:36:58 +00:00
var chars = [];
for ( var i = 0; i < str.length; i++) {
var ch = str.charCodeAt(i);
if (ch < 128) {
chars.push(str.charAt(i));
} else {
var encode = "000" + ch.toString(16);
chars.push("\\u" + encode.substring(encode.length - 4));
}
}
return chars.join('');
},
'toDate':function(string){
2010-01-06 00:36:58 +00:00
var match;
if (typeof string == 'string' &&
(match = string.match(/^(\d\d\d\d)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)Z$/))){
var date = new Date(0);
date.setUTCFullYear(match[1], match[2] - 1, match[3]);
date.setUTCHours(match[4], match[5], match[6], 0);
return date;
}
return string;
}
};
2010-01-12 00:15:12 +00:00
var angularDate = {
'toString':function(date){
2010-01-06 00:36:58 +00:00
function pad(n) { return n < 10 ? "0" + n : n; }
return (date.getUTCFullYear()) + '-' +
pad(date.getUTCMonth() + 1) + '-' +
pad(date.getUTCDate()) + 'T' +
pad(date.getUTCHours()) + ':' +
pad(date.getUTCMinutes()) + ':' +
pad(date.getUTCSeconds()) + 'Z';
}
};
2010-01-12 00:15:12 +00:00
var angularFunction = {
'compile':function(expression) {
2010-01-06 00:36:58 +00:00
if (_.isFunction(expression)){
return expression;
} else if (expression){
2010-01-09 23:02:43 +00:00
var scope = new Scope();
2010-01-06 00:36:58 +00:00
return function($) {
scope.state = $;
return scope.eval(expression);
};
} else {
return function($){return $;};
}
}
};
2010-01-12 00:15:12 +00:00
function defineApi(dst, chain, underscoreNames){
var lastChain = _.last(chain);
foreach(underscoreNames, function(name){
lastChain[name] = _[name];
});
angular[dst] = angular[dst] || {};
foreach(chain, function(parent){
extend(angular[dst], parent);
});
}
defineApi('Global', [angularGlobal],
['extend', 'clone','isEqual',
'isElement', 'isArray', 'isFunction', 'isUndefined']);
defineApi('Collection', [angularGlobal, angularCollection],
['each', 'map', 'reduce', 'reduceRight', 'detect',
'select', 'reject', 'all', 'any', 'include',
'invoke', 'pluck', 'max', 'min', 'sortBy',
'sortedIndex', 'toArray', 'size']);
defineApi('Array', [angularGlobal, angularCollection, angularArray],
['first', 'last', 'compact', 'flatten', 'without',
'uniq', 'intersect', 'zip', 'indexOf', 'lastIndexOf']);
defineApi('Object', [angularGlobal, angularCollection, angularObject],
['keys', 'values']);
defineApi('String', [angularGlobal, angularString], []);
defineApi('Date', [angularGlobal, angularDate], []);
2010-01-26 07:49:52 +00:00
//IE bug
angular['Date']['toString'] = angularDate['toString'];
2010-01-12 00:15:12 +00:00
defineApi('Function', [angularGlobal, angularCollection, angularFunction],
['bind', 'bindAll', 'delay', 'defer', 'wrap', 'compose']);