Skip to content
This repository has been archived by the owner on Feb 22, 2018. It is now read-only.

Commit

Permalink
fix(compiler): Do not store injectors with TaggingElementBinders
Browse files Browse the repository at this point in the history
TaggingElementBinders are long-lived objects and the injectors are
specific to a View.  By storing injectors, Angular is retaining more
memory than needed.

With this change, injectors are local to a ViewFactory.call() invocation.
  • Loading branch information
jbdeboer authored and travis@travis-ci.org committed May 14, 2014
1 parent 6102d8a commit a9dc429
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 11 deletions.
4 changes: 1 addition & 3 deletions lib/core_dom/element_binder.dart
Expand Up @@ -403,7 +403,6 @@ class TaggedTextBinder {
class TaggedElementBinder {
final ElementBinder binder;
int parentBinderOffset;
var injector;
bool isTopLevel;

List<TaggedTextBinder> textBinders;
Expand All @@ -416,6 +415,5 @@ class TaggedElementBinder {
}

String toString() => "[TaggedElementBinder binder:$binder parentBinderOffset:"
"$parentBinderOffset textBinders:$textBinders "
"injector:$injector]";
"$parentBinderOffset textBinders:$textBinders]";
}
18 changes: 10 additions & 8 deletions lib/core_dom/tagging_view_factory.dart
Expand Up @@ -18,29 +18,31 @@ class TaggingViewFactory implements ViewFactory {
try {
assert((timerId = _perf.startTimer('ng.view')) != false);
var view = new View(nodes, injector.get(EventHandler));
_link(view, nodes, elementBinders, injector);
_link(view, nodes, injector);
return view;
} finally {
assert(_perf.stopTimer(timerId) != false);
}
}

_bindTagged(TaggedElementBinder tagged, rootInjector, elementBinders, View view, boundNode) {
_bindTagged(TaggedElementBinder tagged, int elementBinderIndex, rootInjector, elementInjectors, View view, boundNode) {
var binder = tagged.binder;
var parentInjector = tagged.parentBinderOffset == -1 ? rootInjector : elementBinders[tagged.parentBinderOffset].injector;
var parentInjector = tagged.parentBinderOffset == -1 ? rootInjector : elementInjectors[tagged.parentBinderOffset];
assert(parentInjector != null);

tagged.injector = binder != null ? binder.bind(view, parentInjector, boundNode) : parentInjector;
var elementInjector = elementInjectors[elementBinderIndex] =
binder != null ? binder.bind(view, parentInjector, boundNode) : parentInjector;

if (tagged.textBinders != null) {
for (var k = 0, kk = tagged.textBinders.length; k < kk; k++) {
TaggedTextBinder taggedText = tagged.textBinders[k];
taggedText.binder.bind(view, tagged.injector, boundNode.childNodes[taggedText.offsetIndex]);
taggedText.binder.bind(view, elementInjector, boundNode.childNodes[taggedText.offsetIndex]);
}
}
}

View _link(View view, List<dom.Node> nodeList, List elementBinders, Injector rootInjector) {
View _link(View view, List<dom.Node> nodeList, Injector rootInjector) {
var elementInjectors = new List(elementBinders.length);
var directiveDefsByName = {};

var elementBinderIndex = 0;
Expand All @@ -64,13 +66,13 @@ class TaggingViewFactory implements ViewFactory {
TaggedElementBinder tagged = elementBinders[elementBinderIndex];
var boundNode = j == -1 ? node : elts[j];

_bindTagged(tagged, rootInjector, elementBinders, view, boundNode);
_bindTagged(tagged, elementBinderIndex, rootInjector, elementInjectors, view, boundNode);
}
} else if (node.nodeType == 3 || node.nodeType == 8) {
TaggedElementBinder tagged = elementBinders[elementBinderIndex];
assert(tagged.binder != null || tagged.isTopLevel);
if (tagged.binder != null) {
_bindTagged(tagged, rootInjector, elementBinders, view, node);
_bindTagged(tagged, elementBinderIndex, rootInjector, elementInjectors, view, node);
}
elementBinderIndex++;
} else {
Expand Down

0 comments on commit a9dc429

Please sign in to comment.