aboutsummaryrefslogtreecommitdiffstats
path: root/src/directives.js
diff options
context:
space:
mode:
authorMisko Hevery2010-05-31 00:58:29 -0700
committerMisko Hevery2010-05-31 00:58:29 -0700
commit6143b04384680d17f38c2d5894a9b9961ea33288 (patch)
tree244c0f72c1685da2db10f2bb2a2da49816829306 /src/directives.js
parent81dac70e72430b7ab9a824ab923038c1e00e7003 (diff)
downloadangular.js-6143b04384680d17f38c2d5894a9b9961ea33288.tar.bz2
removed few key foreach and replaced thime with for loop for performance.
Diffstat (limited to 'src/directives.js')
-rw-r--r--src/directives.js51
1 files changed, 30 insertions, 21 deletions
diff --git a/src/directives.js b/src/directives.js
index 91a98735..cabf0c23 100644
--- a/src/directives.js
+++ b/src/directives.js
@@ -24,14 +24,17 @@ angularDirective("ng-eval", function(expression){
angularDirective("ng-bind", function(expression){
return function(element) {
- var lastValue, lastError;
+ var lastValue = noop, lastError = noop;
this.$onEval(function() {
var error,
value = this.$tryEval(expression, function(e){
error = toJson(e);
}),
- isHtml = value instanceof HTML,
- isDomElement = isElement(value);
+ isHtml,
+ isDomElement;
+ if (lastValue === value && lastError == error) return;
+ isHtml = value instanceof HTML,
+ isDomElement = isElement(value);
if (!isHtml && !isDomElement && isObject(value)) {
value = toJson(value);
}
@@ -72,14 +75,14 @@ function compileBindTemplate(template){
});
bindTemplateCache[template] = fn = function(element){
var parts = [], self = this;
- foreach(bindings, function(fn){
- var value = fn.call(self, element);
+ for ( var i = 0; i < bindings.length; i++) {
+ var value = bindings[i].call(self, element);
if (isElement(value))
value = '';
else if (isObject(value))
value = toJson(value, true);
parts.push(value);
- });
+ };
return parts.join('');
};
}
@@ -107,21 +110,26 @@ var REMOVE_ATTRIBUTES = {
};
angularDirective("ng-bind-attr", function(expression){
return function(element){
+ var lastValue = {};
this.$onEval(function(){
- foreach(this.$eval(expression), function(bindExp, key) {
- var value = compileBindTemplate(bindExp).call(this, element),
+ var values = this.$eval(expression);
+ for(var key in values) {
+ var value = compileBindTemplate(values[key]).call(this, element),
specialName = REMOVE_ATTRIBUTES[lowercase(key)];
- if (specialName) {
- if (element[specialName] = toBoolean(value)) {
- element.attr(specialName, value);
+ 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)();
} else {
- element.removeAttr(key);
+ element.attr(key, value);
}
- (element.data('$validate')||noop)();
- } else {
- element.attr(key, value);
}
- }, this);
+ };
}, element);
};
});
@@ -153,17 +161,18 @@ angularWidget("@ng-repeat", function(expression, element){
var children = [], currentScope = this;
this.$onEval(function(){
- var index = 0, childCount = children.length, childScope, lastElement = reference;
- foreach(this.$tryEval(rhs, reference), function(value, key){
+ var index = 0, childCount = children.length, childScope, lastElement = reference,
+ collection = this.$tryEval(rhs, reference);
+ for ( var key in collection) {
if (index < childCount) {
// reuse existing child
childScope = children[index];
- childScope[valueIdent] = value;
+ childScope[valueIdent] = collection[key];
if (keyIdent) childScope[keyIdent] = key;
} else {
// grow children
childScope = template(element.clone(), createScope(currentScope));
- childScope[valueIdent] = value;
+ childScope[valueIdent] = collection[key];
if (keyIdent) childScope[keyIdent] = key;
lastElement.after(childScope.$element);
childScope.$index = index;
@@ -174,7 +183,7 @@ angularWidget("@ng-repeat", function(expression, element){
childScope.$eval();
lastElement = childScope.$element;
index ++;
- });
+ };
// shrink children
while(children.length > index) {
children.pop().$element.remove();