Как я могу получить полный текущий URL-адрес в angular 7 без использования window.location.href?
Например, предположим, что мой текущий URL-адрес http://localhost:8080/p/drinks?q=cold&price=200
Как я могу получить полный URL-адрес, а не только /p/drinks?q=cold&price=200?
Я пробовал с this.router.url это дает только /p/drinks?q=cold&price=200 не с полным именем хоста.
Причина, по которой я не хочу использовать window.location.href, заключается в том, что это вызывает проблемы с рендерингом в нг-инструментарий/универсальный.
Я попытался следовать этому решению, которое, похоже, является той же проблемой, что и я, а также обновлено.
Как получить доменное имя для сервиса в 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
];
В app.module.ts
@NgModule({
.......
providers:[
.......
windowProvider
]
})
И на моей необходимой странице:
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);
}
Купить это дает ошибку во время компиляции
ERROR in ./src/app/factory/windowProvider.js 5:20 Module parse failed: Unexpected token (5:20) You may need an appropriate loader to handle this file type. | export const WINDOW = new InjectionToken('window'); |
const windowProvider: FactoryProvider = { | provide: WINDOW, | useFactory: () => window ℹ 「wdm」: Failed to compile.
Может кто-нибудь, пожалуйста, скажите, как я могу решить эту проблему. Спасибо,
Как получить текущий URL-адрес в браузере в Angular 2 с помощью TypeScript?
Еще ссылки, по которым я перешел:
@ Дэвид, я проверил, что ссылка может работать, но я не могу заставить ее работать. Я прокомментировал ваш ответ, не могли бы вы взглянуть.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Сторона универсального сервера не знает о window.location.
С другой стороны, экспресс-сервер знает URL-адрес из запроса, который был отправлен на сторону сервера.
Итак, нам нужно ввести URL-адрес запроса из экспресса в угловой.
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);
});
});
.. чтобы получить его там, где он нам нужен..
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.info('server greets you via ' + requestUrl)
} else {
console.info('browser says hello from ' + window.location.href)
}
}
}
template — это константа или что-то подобное. Если я импортирую его из ядра angular, он выдает ошибку
template — это полный путь к вашему шаблону index.html: «Функция renderModuleFactory() принимает в качестве входных данных HTML-страницу шаблона (обычно index.html), модуль Angular, содержащий компоненты, и маршрут, определяющий, какие компоненты отображать» цитата из угловых документов. Я также отредактировал ответ соответственно.
Посмотрите здесь, если это поможет stackoverflow.com/a/47205502/1160794