Можно ли переключать шаблоны Angular HTML?

Допустим, у нас есть услуга, имеющая значение mobile: boolean. В зависимости от этого мы отображаем правильный TemplateUrl для компонентов, которым он нужен.

Так что это будет что-то вроде TemplateUrl: condition ? template_1 : template_2

Я могу создать что-то подобное с помощью require, но оно не будет правильно собираться для производства. Когда я захожу на страницу с ним, я вижу null вместо шаблона (только prod).

Угловая версия 7

В общем, это можно решить стандартной настройкой html/css или angular + flexlayout, если хотите. причина, по которой вы столкнетесь с проблемами, скорее всего, связана с AOT в prod вместо JIT для dev. Кроме того, я нашел аналогичный вопрос: stackoverflow.com/questions/49974776/…, который также говорит, что это невозможно, поскольку вы собираетесь это сделать.

jcuypers 10.04.2019 23:00

Я не думаю, что у вас может быть условное templateUrl. Предполагая, что mobile известно во время выполнения, вы можете поместить оба шаблона в один и тот же файл шаблона и использовать ngIf ... else, чтобы отобразить соответствующий в зависимости от условия.

ConnorsFan 10.04.2019 23:06

Почему бы просто не поместить оба варианта в один шаблон и не использовать *ngIf?

Dimanoid 10.04.2019 23:06

Да, я видел эту ссылку, и да, это про AOT в prod. Прошло какое-то время с angular 5, поэтому у меня была небольшая надежда, что что-то изменилось в этой теме. Да, я мог бы сделать это с помощью ngIf или создать абстрактные классы и компоненты для мобильных / настольных компьютеров, чтобы наследовать от него, чтобы держать логику в одном месте + сделать отдельную маршрутизацию для мобильных устройств, но это довольно уродливое решение.

Adrian Sawicki 10.04.2019 23:09
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
4
395
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Объявление @Component обрабатывается статически с усложнением AOT, и templateUrl не может быть предоставлено на основе переменной.

Способ справиться с этим состоит в том, чтобы отделить вашу логику от способа отображения страницы. Для любой части пользовательского интерфейса, которая по-разному отображается на мобильных устройствах и компьютерах, можно создать отдельный компонент. Основной компонент или общий базовый класс или компонент должны содержать всю логику.

<div>

  <p>Graph:</p>

  <graph-mobile *ngIf = "mobile" [data] = "data"></graph-mobile>

  <graph-desktop *ngIf = "!mobile" [data] = "data"></graph-desktop>

</div>

Да, это самый простой способ решить эту проблему, но я ищу что-то более умное (если даже есть лучший способ ее решить). Кстати: Плохая вещь в том, что вам нужно скопировать логику в 2 файла машинописного текста. Я думаю об абстрактных классах + что-то похожее, но больше основанное на маршрутизации.

Adrian Sawicki 10.04.2019 23:14

Я обновил ответ, чтобы было более понятно, что логика не должна дублироваться. Маршрутизация в порядке. Вы можете попытаться построить маршруты своего приложения динамически или использовать средства защиты активации (CanActivate), чтобы, возможно, перенаправлять пользователей на основе мобильного значения.

Noremac 10.04.2019 23:24

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