diff --git a/benchmark/web/tree-tmpl.html b/benchmark/web/tree-tmpl.html
new file mode 100644
index 000000000..12a8d2241
--- /dev/null
+++ b/benchmark/web/tree-tmpl.html
@@ -0,0 +1,4 @@
+ {{ctrl.data.value}}
+
+
+
diff --git a/benchmark/web/tree.dart b/benchmark/web/tree.dart
index cc3975311..81d3e8b13 100644
--- a/benchmark/web/tree.dart
+++ b/benchmark/web/tree.dart
@@ -19,6 +19,15 @@ class TreeComponent {
var data;
}
+@Component(
+ selector: 'tree-url',
+ templateUrl: 'tree-tmpl.html',
+ publishAs: 'ctrl')
+class TreeUrlComponent {
+ @NgOneWay('data')
+ var data;
+}
+
// This is a baseline implementation of TreeComponent.
// It assumes the data never changes and simply throws elements on the DOM
@@ -239,6 +248,7 @@ main() {
var module = new Module()
..type(TreeComponent)
+ ..type(TreeUrlComponent)
..type(NgFreeTree)
..type(NgFreeTreeScoped)
..type(NgFreeTreeClass)
diff --git a/benchmark/web/tree.html b/benchmark/web/tree.html
index f8839c187..b7040040d 100644
--- a/benchmark/web/tree.html
+++ b/benchmark/web/tree.html
@@ -14,12 +14,14 @@
Default:
+ From URL:
Baseline:
Baseline + scope:
Baseline + class:
+
diff --git a/lib/core_dom/view_factory.dart b/lib/core_dom/view_factory.dart
index e65a914c3..2fec262ba 100644
--- a/lib/core_dom/view_factory.dart
+++ b/lib/core_dom/view_factory.dart
@@ -118,6 +118,7 @@ class WalkingViewFactory implements ViewFactory {
@Injectable()
class ViewCache {
// _viewFactoryCache is unbounded
+ // This cache contains both HTML and URL keys.
final viewFactoryCache = new LruCache();
final Http http;
final TemplateCache templateCache;
@@ -138,8 +139,15 @@ class ViewCache {
}
async.Future fromUrl(String url, DirectiveMap directives) {
- return http.get(url, cache: templateCache).then(
- (resp) => fromHtml(resp.responseText, directives));
+ ViewFactory viewFactory = viewFactoryCache.get(url);
+ if (viewFactory == null) {
+ return http.get(url, cache: templateCache).then((resp) {
+ var viewFactoryFromHttp = fromHtml(resp.responseText, directives);
+ viewFactoryCache.put(url, viewFactoryFromHttp);
+ return viewFactoryFromHttp;
+ });
+ }
+ return new async.Future.value(viewFactory);
}
}
diff --git a/lib/core_dom/web_platform.dart b/lib/core_dom/web_platform.dart
index 37921acad..bd615cea3 100644
--- a/lib/core_dom/web_platform.dart
+++ b/lib/core_dom/web_platform.dart
@@ -91,7 +91,14 @@ class PlatformViewCache implements ViewCache {
}
async.Future fromUrl(String url, DirectiveMap directives) {
- return http.get(url, cache: templateCache).then(
- (resp) => fromHtml(resp.responseText, directives));
+ ViewFactory viewFactory = viewFactoryCache.get(url);
+ if (viewFactory == null) {
+ return http.get(url, cache: templateCache).then((resp) {
+ var viewFactoryFromHttp = fromHtml(resp.responseText, directives);
+ viewFactoryCache.put(url, viewFactoryFromHttp);
+ return viewFactoryFromHttp;
+ });
+ }
+ return new async.Future.value(viewFactory);
}
}
diff --git a/test/core/templateurl_spec.dart b/test/core/templateurl_spec.dart
index 3eb2c8605..693127947 100644
--- a/test/core/templateurl_spec.dart
+++ b/test/core/templateurl_spec.dart
@@ -269,15 +269,9 @@ void main() {
'Simple!
'
);
- // Since the template cache is disabled, we expect a 'simple.html' call.
- backend
- ..expectGET('simple.html').respond(200, 'Simple!
');
-
var element2 = e('ignore');
compile([element2], directives)(injector, [element2]);
- microLeap();
- backend.flush();
microLeap();
expect(element2.children[0].shadowRoot).toHaveHtml(