Angular 7: как я могу получить полный URL-адрес текущей страницы

Как я могу получить полный текущий 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.

Может кто-нибудь, пожалуйста, скажите, как я могу решить эту проблему. Спасибо,

Еще ссылки, по которым я перешел:

Посмотрите здесь, если это поможет stackoverflow.com/a/47205502/1160794

David 06.05.2019 15:06

@ Дэвид, я проверил, что ссылка может работать, но я не могу заставить ее работать. Я прокомментировал ваш ответ, не могли бы вы взглянуть.

user7747472 07.05.2019 08:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
6
2
12 776
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сторона универсального сервера не знает о 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, он выдает ошибку
user7747472 10.05.2019 16:49
template — это полный путь к вашему шаблону index.html: «Функция renderModuleFactory() принимает в качестве входных данных HTML-страницу шаблона (обычно index.html), модуль Angular, содержащий компоненты, и маршрут, определяющий, какие компоненты отображать» цитата из угловых документов. Я также отредактировал ответ соответственно.
lolcatzftw 13.05.2019 00:58

Другие вопросы по теме