Angular 2のtemplateUrlとstyleUrlのパスの問題をどのように解決しますか?
前言:
templateUrl
は、コンポーネントがブラウザで実行されるときに依存するテンプレートアドレスを示すため、templateUrl
では./xxx.html
というパスを記入することはできません.ブラウザのパスから考慮してください.src
index.html
index.js //
components
button
button.ts
button.html
index.html
, button.html
を くパスは ですか/components/button/button.html
だからあなたのbutton.ts
の のtemplateUrl
に して/components/button/button.html
,templateUrl
と くべきパスはあなたが したhtmlファイルのパスに づいて するべきです
に
component
フォルダ のコンポーネントのtemplateUrl
に/components
を く がある は ではありませんが、もちろんここではパスが くて ですが、パスが い は/a/b/c/d/e/f/components
では、 コンポーネント にそんなに いアドレスを くのではないでしょうか.また、 に してもファイルごとに する があります.
ソリューション
Angular 2は、package:
またはasset:
プレースホルダを することができます.この2つのプレースホルダのデフォルトに する は/packages
です.templateUrl:'package:/button/button.html'
を すると、 にこのアドレスが/packages/button/button.html
に き えられます.ここでは、Token
をリセットすることで、PACKAGE_ROOT_URL
のprovideに する があります.
import {provide,PACKAGE_ROOT_URL} from 'angular2/core';
bootstrap(App,[provide(PACKAGE_ROOT_URL,{useValue: '/components'})])
/components/button/button.html
package:
またはasset:
プレースホルダは にロードされたパスを することができ、プロジェクトが な にリリースされた 、 たちの ファイルはCDN にあるはずだ.もちろんPACKAGE_ROOT_URL
を じてもこのパスの を することができるが、 が りない.では、1つのtemplateUrl
だけでは できません.
ソリューション
Angular 2のソースコードでは、http://cdn.template.kittencup.com
およびstyleUrl
がロードされる にhttp://cdn.style.kittencup.com
オブジェクトによって され、PACKAGE_ROOT_URL
オブジェクトは に して され、ソースコードはsrc/compiler/url_resolver.ts、デフォルトのtemplateUrl
はstyleUrl
の に づいてUrlResolver
またはUrlResolver
プレースホルダを き えるので、UrlResolver
をリセットすることができ、コードは の りである.
、
@Component({
selector: "hz-stepbody",
templateUrl: "dm_template.html"// , /dm_template.html
})
class Stepbody { }
import {UrlResolver} from 'angular2/compiler';
class MyUrlResolver extends UrlResolver {
resolve(baseUrl: string, url: string): string {
if (url.substr(-4) === '.css') {
return super.resolve('http://cdn.style.kittencup.com', url);
}else if(url.substr(-5) === '.html'){
return super.resolve('http://cdn.template.kittencup.com', url);
}
return super.resolve(baseUrl, url);
}
}
bootstrap(App, [provide(UrlResolver, {useClass: MyUrlResolver})]);
、@Component({
selector: "hz-stepbody",
templateUrl: "mytemplate:dm_template.html"
})
class Stepbody { }
import {provide, PACKAGE_ROOT_URL} from 'angular2/core';
import {UrlResolver} from 'angular2/compiler';
class MyUrlResolver extends UrlResolver {
resolve(baseUrl: string, url: string): string {
var resolvedUrl = url;
if (url.substr(0, 6) == "mytemplate") {
resolvedUrl = resolvedUrl.replace("mytemplate:", "/template/gz/");
}else {
resolvedUrl = super.resolve(baseUrl, url);
}
return resolvedUrl;
}
}
PACKAGE_ROOT_URL
package: