在Angular 1中,我们使用$ templateCache作为一种方法,以便在我们引导应用程序时避免XHR关闭服务器中的每个模板。在Angular 2中,似乎没有现成的这种机制。
我能做的是在编译器中替换XHR:
function myXhr() {};
myXhr.prototype.get = function(url) {
return new Promise(function(resolve, reject) {
$.ajax({
url:url,
method:'GET',
success:resolve,
error:reject
});
});
};
ng.platform.browser.bootstrap(MyApp, [
ng.core.provide(ng.compiler.XHR, {useClass:myXhr})
]);
然后调整我的XHR getter以首先检查本地缓存。这是首选方法吗?
答案 0 :(得分:3)
我已经习惯在打字稿中使用所有组件的模板字符串。我发现在一个TS文件中使用html和视图逻辑非常方便。 您还可以查看模块加载器/捆绑器,如JSPM或WebPack。这些出色的构建工具使用如下所示的模块语法将所有模板提取到构建中:
let html = require('./about.html!text');
@Component({
selector:"my-about",
template:html
})
答案 1 :(得分:2)
Angular2中的缓存工作原理如下:
应用层:调用ViewContainerRef
上的方法(例如ViewContainerRef.createComponent
)。
reflector.registerType
将组件类型注册为注释
ComponentResolver.resolveComponent
现在返回ComponentFactory
ComponentResolver.resolveComponent
首先检查类型注释,然后再返回Promise
Angular 2.0 Alpha中的初始设计:
ProtoView是一个原型视图,是模板编译的结果,Angular使用它来根据编译的模板有效地创建此视图的实例。
RenderProtoViewRef是Application Context中可用的ProtoViewRef的对应物。但与ProtoViewRef不同,RenderProtoViewRef包含所有静态嵌套的Proto Views,它们以递归方式合并到单个Render Proto View中。
不再可能实施ng-include。编译器需要ComponentDirective才能编译HTML。因此,您无法单独编译HTML并将其包含在View中。
自最初的Angular 2.0 Beta以来的相关更改:
编译器重命名为ComponentResolver,Compiler.compileInHost已重命名为ComponentResolver.resolveComponent。
Renderer接口现在在普通本机节点上运行,而不是RenderElementRefs或RenderViewRefs
AppViewManager重命名为ViewUtils,仅仅是一项私人公用事业服务。
<强>参考强>