aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShyam Seshadri2010-06-02 15:04:26 -0700
committerShyam Seshadri2010-06-02 15:04:26 -0700
commita29c5e4c7fd5e708c28e70e974bf873621d5277c (patch)
tree17efcdc2df48d32a0a928cc2ab755f355e9f6ae1
parent6143b04384680d17f38c2d5894a9b9961ea33288 (diff)
downloadangular.js-a29c5e4c7fd5e708c28e70e974bf873621d5277c.tar.bz2
Revert "removed few key foreach and replaced thime with for loop for performance."
This reverts commit 6143b04384680d17f38c2d5894a9b9961ea33288.
-rw-r--r--scenario/perf.html3
-rw-r--r--src/Scope.js21
-rw-r--r--src/directives.js51
3 files changed, 31 insertions, 44 deletions
diff --git a/scenario/perf.html b/scenario/perf.html
index cd676918..e4edc00f 100644
--- a/scenario/perf.html
+++ b/scenario/perf.html
@@ -24,8 +24,7 @@
<input type="text" name="text"/>
<hr/>
<ul>
- <li Xng-repeat="item in items.$filter('').$orderBy('name')"
- ng-repeat="item in items">
+ <li ng-repeat="item in items.$filter('').$orderBy('name')">
{{item.name}} <a href="#{{item.name}}">{{item.parts.join(', ')}}</a>
</li>
</ul>
diff --git a/src/Scope.js b/src/Scope.js
index 637fc25e..1c223130 100644
--- a/src/Scope.js
+++ b/src/Scope.js
@@ -53,15 +53,14 @@ function getterFn(path){
var code = 'function (self){\n';
code += ' var last, fn, type;\n';
foreach(path.split('.'), function(key) {
- key = (key == 'this') ? '["this"]' : '.' + key;
code += ' if(!self) return self;\n';
code += ' last = self;\n';
- code += ' self = self' + key + ';\n';
+ code += ' self = self.' + key + ';\n';
code += ' if(typeof self == "function") \n';
- code += ' self = function(){ return last'+key+'.apply(last, arguments); };\n';
- if (key.charAt(1) == '$') {
+ code += ' self = function(){ return last.'+key+'.apply(last, arguments); };\n';
+ if (key.charAt(0) == '$') {
// special code for super-imposed functions
- var name = key.substr(2);
+ var name = key.substr(1);
code += ' if(!self) {\n';
code += ' type = angular.Global.typeOf(last);\n';
code += ' fn = (angular[type.charAt(0).toUpperCase() + type.substring(1)]||{})["' + name + '"];\n';
@@ -124,13 +123,11 @@ function createScope(parent, services, existing) {
if (exp !== undefined) {
return expressionCompile(exp).apply(instance, slice.call(arguments, 1, arguments.length));
} else {
- for ( var i = 0, iSize = evalLists.sorted.length; i < iSize; i++) {
- for ( var queue = evalLists.sorted[i],
- jSize = queue.length,
- j= 0; j < jSize; j++) {
- instance.$tryEval(queue[j].fn, queue[j].handler);
- }
- }
+ foreach(evalLists.sorted, function(list) {
+ foreach(list, function(eval) {
+ instance.$tryEval(eval.fn, eval.handler);
+ });
+ });
}
},
diff --git a/src/directives.js b/src/directives.js
index cabf0c23..91a98735 100644
--- a/src/directives.js
+++ b/src/directives.js
@@ -24,17 +24,14 @@ angularDirective("ng-eval", function(expression){
angularDirective("ng-bind", function(expression){
return function(element) {
- var lastValue = noop, lastError = noop;
+ var lastValue, lastError;
this.$onEval(function() {
var error,
value = this.$tryEval(expression, function(e){
error = toJson(e);
}),
- isHtml,
- isDomElement;
- if (lastValue === value && lastError == error) return;
- isHtml = value instanceof HTML,
- isDomElement = isElement(value);
+ isHtml = value instanceof HTML,
+ isDomElement = isElement(value);
if (!isHtml && !isDomElement && isObject(value)) {
value = toJson(value);
}
@@ -75,14 +72,14 @@ function compileBindTemplate(template){
});
bindTemplateCache[template] = fn = function(element){
var parts = [], self = this;
- for ( var i = 0; i < bindings.length; i++) {
- var value = bindings[i].call(self, element);
+ foreach(bindings, function(fn){
+ var value = fn.call(self, element);
if (isElement(value))
value = '';
else if (isObject(value))
value = toJson(value, true);
parts.push(value);
- };
+ });
return parts.join('');
};
}
@@ -110,26 +107,21 @@ var REMOVE_ATTRIBUTES = {
};
angularDirective("ng-bind-attr", function(expression){
return function(element){
- var lastValue = {};
this.$onEval(function(){
- var values = this.$eval(expression);
- for(var key in values) {
- var value = compileBindTemplate(values[key]).call(this, element),
+ foreach(this.$eval(expression), function(bindExp, key) {
+ var value = compileBindTemplate(bindExp).call(this, element),
specialName = REMOVE_ATTRIBUTES[lowercase(key)];
- if (lastValue[key] !== value) {
- lastValue[key] = value;
- if (specialName) {
- if (element[specialName] = toBoolean(value)) {
- element.attr(specialName, value);
- } else {
- element.removeAttr(key);
- }
- (element.data('$validate')||noop)();
+ if (specialName) {
+ if (element[specialName] = toBoolean(value)) {
+ element.attr(specialName, value);
} else {
- element.attr(key, value);
+ element.removeAttr(key);
}
+ (element.data('$validate')||noop)();
+ } else {
+ element.attr(key, value);
}
- };
+ }, this);
}, element);
};
});
@@ -161,18 +153,17 @@ angularWidget("@ng-repeat", function(expression, element){
var children = [], currentScope = this;
this.$onEval(function(){
- var index = 0, childCount = children.length, childScope, lastElement = reference,
- collection = this.$tryEval(rhs, reference);
- for ( var key in collection) {
+ var index = 0, childCount = children.length, childScope, lastElement = reference;
+ foreach(this.$tryEval(rhs, reference), function(value, key){
if (index < childCount) {
// reuse existing child
childScope = children[index];
- childScope[valueIdent] = collection[key];
+ childScope[valueIdent] = value;
if (keyIdent) childScope[keyIdent] = key;
} else {
// grow children
childScope = template(element.clone(), createScope(currentScope));
- childScope[valueIdent] = collection[key];
+ childScope[valueIdent] = value;
if (keyIdent) childScope[keyIdent] = key;
lastElement.after(childScope.$element);
childScope.$index = index;
@@ -183,7 +174,7 @@ angularWidget("@ng-repeat", function(expression, element){
childScope.$eval();
lastElement = childScope.$element;
index ++;
- };
+ });
// shrink children
while(children.length > index) {
children.pop().$element.remove();