diff options
| author | Shyam Seshadri | 2010-06-02 15:04:26 -0700 |
|---|---|---|
| committer | Shyam Seshadri | 2010-06-02 15:04:26 -0700 |
| commit | a29c5e4c7fd5e708c28e70e974bf873621d5277c (patch) | |
| tree | 17efcdc2df48d32a0a928cc2ab755f355e9f6ae1 | |
| parent | 6143b04384680d17f38c2d5894a9b9961ea33288 (diff) | |
| download | angular.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.html | 3 | ||||
| -rw-r--r-- | src/Scope.js | 21 | ||||
| -rw-r--r-- | src/directives.js | 51 |
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(); |
