ASP.NET MVC Core 2 и Angular 5 Beginner - компонент не отображается без корневого каталога приложения

Я пытаюсь запустить супер-базовое веб-приложение ASP.NET Core 2 и Angular 5, и у меня возникла проблема с тем, что компонент не отображается, если я также не включу компонент корневого приложения.

Итак, симптомы, которые я получаю, заключаются в том, что если я включу корень приложения в Home или Gallery Index.cshtml, тогда это будет нормально, если я включу миниатюра ниже этого, тогда это также будет хорошо видно. Однако, если я удалю корень приложения и оставлю миниатюра, то ничего не появится.

Я уверен, что мне не хватает чего-то супер простого, и я предполагаю, что это из-за зависимостей или app.module, но я недостаточно хорошо понимаю Angular на данный момент, чтобы понять это. Я часами гуглил и безуспешно пытался разобраться в этом :(

Все, что я хотел бы сделать, это иметь кучу компонентов, которые я могу независимо использовать в разных представлениях вместе или по отдельности.

Вот ссылка репозитория github на проект: https://github.com/rpasechnikov/AspNetCore2Angular5EfCoreSampleWebsite

Спасибо!!

Пожалуйста, можете ли вы добавить код из обоих компонентов и основного файла html так, как вы начинаете с AppComponent или GalleryThumbnail?

Oscar Paz 14.03.2018 16:52

Спасибо за ваш ответ! Я обновил OP выше :)

Ross 14.03.2018 17:31
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
2
381
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Поэкспериментировав, я нашел проблему.

Когда вы помещаете компоненты в массив bootstrap основного модуля, Angular ожидает, что все из них будет отображаться на странице. Компоненты в массиве bootstrap не являются необязательными, но обязательными. Фактически, за исключением случаев, когда вы добавляете оба компонента в файлы HTML, вы получаете исключение (проверьте свою консоль). Разница в том, что, когда вы просто пропускаете GalleryThumbnail, ошибка возникает после того, как Angular отрендерил AppComponent, что позволяет вам полагать, что ничего не случилось, хотя на самом деле это было. Да, страница вроде бы работоспособна, хотя я бы не поверил, что она будет работать правильно.

Проблема, когда вы не включаете AppComponent, заключается в том, что в вашем модуле этот компонент является первым, добавленным в массив начальной загрузки, поэтому Angular пытается найти <app-root> на странице. Когда этого не происходит, он запускает исключение, и начальная загрузка внезапно завершается, поэтому он никогда не сможет отобразить GalleryThumbnail.

В заключение, вы не можете использовать массив начальной загрузки для выбора между корневыми компонентами. Если вы хотите инициализировать только один из них, вы должны:

  1. Измените имя AppComponent на другое (HomeComponent?)
  2. Создайте новый AppComponent, и в его шаблоне вы просто визуализируете либо HomeComponent, либо GalleryThumbnail, в зависимости от того, какие критерии вы хотите (URL страницы, некоторая глобальная переменная, которую вы добавляете на страницу .cshtml ...)

Вы также можете использовать маршрутизацию, чтобы определить, какой компонент показывать, добавив RouteOutlet в этот новый шаблон AppComponent вместо использования ngIf или ngSwitch для выбора компонента для рендеринга. Таким образом, у вас есть только один файл .cshtml, и на основе URL-адреса Angular будет отображать тот или иной компонент. Это должен быть ваш подход при работе с различными страницами в Angular, поскольку это структура, предназначенная для создания SPA. Это немного сложнее, чем просто использовать ngIf в этом простом случае, но это также гораздо более масштабируемое решение, так что это определенно правильный путь, если вы планируете расширять свое приложение и иметь больше маршрутов в будущем.

Если вы решите изменить свой подход к этому, убедитесь, что вы добавляете маршруты в основное приложение ASP.NET, которые соответствуют тем, которые определены в Angular, и что все они возвращают вашу страницу Home / Index.cshtml.

Надеюсь, это поможет.

Спасибо большое за Ваш ответ! В этом есть смысл! Я думаю, что отчасти моя путаница связана с отсутствием четкого понимания компонентов angular и модулей и того, как они потребляются внутри моих .cshtml Views. Я думал, что буду создавать свои представления внутри файлов .cshtml с несколькими компонентами в них. Ваш ответ, кажется, подсказывает мне, что я должен создать корневой компонент и спроектировать все представление в этом компоненте? Я думаю, что изо всех сил пытаюсь понять, где проходит граница между файлами .cshtml и компонентом angular.

Ross 15.03.2018 22:07

Да, с Angular должно быть так. HTML-страница в Angular должна быть простой поддержкой для размещения приложения Angular. Однако вы можете поместить на страницу статический контент, такой как верхний или нижний колонтитул, или другой контент, связанный с SEO (поскольку многие поисковые системы не могут обрабатывать приложения Angular)

Oscar Paz 15.03.2018 22:11

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