Angular 7:如何获取当前页面的完整URL

use*_*472 2 javascript angular-universal angular angular7

如何在不使用angular 7的情况下获取完整的当前URL window.location.href

例如,假设我当前的网址是 http://localhost:8080/p/drinks?q=cold&price=200

如何获得完整的URL而不仅仅是完整的URL /p/drinks?q=cold&price=200

我已经尝试过使用this.router.url此命令,但/p/drinks?q=cold&price=200不能提供完整的主机名。

我不想使用的window.location.href原因是它导致ng-toolkit / universal中的渲染出现问题

我尝试遵循此解决方案,这似乎与我存在相同的问题,并且也进行了更新

如何在Angular2中获取服务域名

这是我的代码

windowProvider.js

import { InjectionToken, FactoryProvider } from '@angular/core';

export const WINDOW = new InjectionToken<Window>('window');

const windowProvider: FactoryProvider = {
  provide: WINDOW,
  useFactory: () => window
};

export const WINDOW_PROVIDERS = [
  windowProvider
];
Run Code Online (Sandbox Code Playgroud)

app.module.ts中

@NgModule({
    .......
    providers:[
    .......
    windowProvider
   ]
})
Run Code Online (Sandbox Code Playgroud)

在我的必填页面中:

import {WINDOW as WindowFactory} from '../../factory/windowProvider';
......
 constructor(private router: Router, private helper: Helpers,
             @Inject(WindowFactory) private windowFactory: any,
            ) {
console.warn('HELLO I M WINDOW FACTORY', this.windowFactory.location.hostname);
}
Run Code Online (Sandbox Code Playgroud)

购买此在编译时给出错误

./src/app/factory/windowProvider.js中的错误5:20模块解析失败:意外的令牌(5:20)您可能需要适当的加载程序来处理此文件类型。| export const WINDOW = new InjectionToken('window'); |

const windowProvider:FactoryProvider = {| 提供:WINDOW,| useFactory:()=>窗口??wdm ?:编译失败。

谁能告诉我如何解决这个问题。谢谢,

我关注的更多链接:

lol*_*ftw 5

通用服务器端不知道window.location。

另一方面,快递服务器从发送到服务器端的请求中知道URL。

因此,我们需要将请求网址从express注入角度。

server.ts

let template = readFileSync(join(__dirname, '..', 'dist', 'index.html')).toString();

app.engine('html', (_, options, callback) => {
    renderModuleFactory(AppServerModuleNgFactory, {
        document: template,
        url: options.req.url,
        extraProviders: [
            { provide: 'requestUrl', useFactory: () => options.req.url, deps: [] },    // 1. set up the provider for the url
            provideModuleMap(LAZY_MODULE_MAP)
        ]
    }).then(html => {
        callback(null, html);
    });
});
Run Code Online (Sandbox Code Playgroud)

..以便在我们需要的地方检索它。

url-logger.ts

class UrlLogger {
    constructor(
        private window: Location,
        private injector: Injector,                         // 2. we need the injector to ..
        @Inject(PLATFORM_ID) private platformId: string,
    ) { }

    public log() {
        if (isPlatformServer(this.platformId)) {
            const requestUrl = this.injector.get('requestUrl');    // 3. ..retrieve the injected url
            console.log('server greets you via ' + requestUrl)
        } else {
            console.log('browser says hello from ' + window.location.href)
        }
    } 
}
Run Code Online (Sandbox Code Playgroud)