如何在 Angular 中获得完整的 url?
How to get full url in Angular?
我的应用程序利用了 Angular Universal,我想在 Angular 组件中获取当前 url
的完整路径。我想我必须在可能需要注入 window 的地方使用 window
对象,或者更好的选择是简单地检查它是否在浏览器中。是否有使用 Angular 的 API 的更清洁的解决方案?
url: string;
constructor(private router: Router) { }
ngOnInit() {
this.router.events.subscribe((val) => {
this.url = `${window.location.protocol}//${window.location.host}${window.location.pathname}`;
});
}
编辑:我要问的问题是如何以符合 Angular Universal
的方式获得完整的 url
如果您使用的是 Express,则可以将 url 从 express 注入到您的组件中
第 1 步:修改您的节点服务器以传递您想要的 url
//Get index.html file contents from dist/browser/index.html
const DIST_FOLDER = join(process.cwd(), 'dist');
const template = readFileSync(join(DIST_FOLDER, 'browser', 'index.html')).toString();
app.engine('html', (_, options, callback) => {
var fullUrl = options.req.protocol + '://' + options.req.get('host') + options.req.originalUrl;
renderModuleFactory(AppServerModuleNgFactory, {
// Our index.html
document: template,
url: options.req.url,
// DI so that we can get lazy-loading to work differently (since we need it to just instantly render it)
extraProviders: [
provideModuleMap(LAZY_MODULE_MAP),
{
provide: 'serverUrl',
useValue: fullUrl
}
]
}).then(html => {
callback(null, html);
});
});
第 2 步:在您的 component/service 中添加一个可选参数
constructor(@Inject(PLATFORM_ID) private platformId: Object, @Optional() @Inject('serverUrl') protected serverUrl: string)
{
// Here, this.serverUrl will have a value only when using angular universal
我的应用程序利用了 Angular Universal,我想在 Angular 组件中获取当前 url
的完整路径。我想我必须在可能需要注入 window 的地方使用 window
对象,或者更好的选择是简单地检查它是否在浏览器中。是否有使用 Angular 的 API 的更清洁的解决方案?
url: string;
constructor(private router: Router) { }
ngOnInit() {
this.router.events.subscribe((val) => {
this.url = `${window.location.protocol}//${window.location.host}${window.location.pathname}`;
});
}
编辑:我要问的问题是如何以符合 Angular Universal
的方式获得完整的url
如果您使用的是 Express,则可以将 url 从 express 注入到您的组件中
第 1 步:修改您的节点服务器以传递您想要的 url
//Get index.html file contents from dist/browser/index.html
const DIST_FOLDER = join(process.cwd(), 'dist');
const template = readFileSync(join(DIST_FOLDER, 'browser', 'index.html')).toString();
app.engine('html', (_, options, callback) => {
var fullUrl = options.req.protocol + '://' + options.req.get('host') + options.req.originalUrl;
renderModuleFactory(AppServerModuleNgFactory, {
// Our index.html
document: template,
url: options.req.url,
// DI so that we can get lazy-loading to work differently (since we need it to just instantly render it)
extraProviders: [
provideModuleMap(LAZY_MODULE_MAP),
{
provide: 'serverUrl',
useValue: fullUrl
}
]
}).then(html => {
callback(null, html);
});
});
第 2 步:在您的 component/service 中添加一个可选参数
constructor(@Inject(PLATFORM_ID) private platformId: Object, @Optional() @Inject('serverUrl') protected serverUrl: string)
{
// Here, this.serverUrl will have a value only when using angular universal