如何在Angular中获取完整的URL?

时间:2017-11-07 03:07:26

标签: angular angular-universal

我的应用程序利用了Angular Universal,我希望获得Angular组件中当前url的完整路径。我想我必须使用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

1 个答案:

答案 0 :(得分:3)

如果您使用的是Express,则可以将快递中的网址注入您的组件

步骤1:修改您的节点服务器以传递您想要的网址

//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:在您的组件/服务中,添加一个optionnal参数

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