Динамическое создание компонентов в Angular (Перевод) | by Alexander Bukhtatyy
Оригинал: https://netbasal.com/dynamically-creating-components-with-angular-a7346f4a982d
В данной статье, мы изучим как динамический создать компонент в Angular.
Для начала нам нужен компонент.
Для простоты мы собираемся использовтаь простой компонент alert
который будет принимать как Input
тип алерта.
Итак, если задуматьяс то каждый компонент влется DOM элементом, так что когда вам нужно добавтиь елемент, вам нужно место куда положить его.
В Angular, такое место называется container.
В my-app
компоненте, мы создадим шаблонный элемент. Мы так же пометим его хэш символом (#)для обьявления ссылки под названием alertContainer
. template
элемнет является тем самым местом, или в мире Angular , container.
Замечание: Контейнером может быть любой DOM-элемент или компонент.
Теперь нам нужно достать ссылку на наш контейнер в my-app
компоненте.
Мы можем достать ссылку на контейнер использу ViewChild
декоратор который так же принимает локальную переменную в качестве параметра.
По умолчанию значение декоратораViewChild
— это экземпляр компонента или DOM-элемент, но в нашем случае нам нужно достать элемент как ViewContainerRef
.
Как следует из названия, ViewContainerRef
является ссылкой на контейнер. ViewContainerRef
хранит ссылку на шаблонный елемент (наш контейнер) и так же предоставляет API для создания компонентов.
Создадим 2 кнопки которые помогут нам создать alert
компонент.
Прежде чем мы вызовем createComponent()
метод, нам нужно добавиль еще один сервис.
ComponentFactoryResolver
сервис предоставлет один основной метод — resolveComponentFactory
.
resolveComponentFactory()
метод берет компонент и возвращает ComponentFactory
.
Вы можете думать о ComponentFactory
как о обьекте который знает как создавать компоненты.
Как вы можете наблюдать ComponentFactory
предоставляет create()
метод который будет использован внутри контейнера (ViewContainerRef ).
Теперь послендний шаг.
Давайте обьясню что происходит шаг за шагом.
Каждый раз когда нам нужно создать компонент нам нужно удалить предыдущее представление, иначе компоненты будут добавляться в контейнер. не обязательно если вам нужно добавить несколько компонентов.
Метод resolveComponentFactory()
принимает компонент и возвращает фабрику(рецепт) для создания этого компонента.
Мы вызываем createComponent()
метод и передаем ему рецепт. Внутри этого метода будет вызван метод create()
из фабрики и будет добавлен компонент после нашего контейнера.
Теперь мы имеем ссылку на наш новый компонент, и мы может устрановить через Input
свойство типа.
Вы так же можете подписаться на Output
компонента как продемонстрированно ниже:
И не забудьте уничтожить компонент:
Последним шагом будет — добавление вашего динамического компонента в entryComponents секцию вашего модуля:
python — динамическое создание окон и присвоение им идентификатора
id = child_window.index(child_window) #тут вываливается ошибка
Функция index
ищет в списке объект и если его не будет, выбросит исключение ValueError
, а у вас в функцию передается число, хотя в списке объекты дочерних окон. Исключения нужно ловить через try
/except
. В примере покажу как обрабатывать исключения, что не были пойманы в try
/except
, через sys.excepthook
Насчет кода, я бы сказал выглядит неплохо. Но названия классов нужно писать с верхнего регистра и в верблюжьей нотации, и думаю лучше не писать в названии class
, для примера: MainWindow
.
А переменные child_count = 0, child_window = []
я бы перенес в сам класс MainWindow
. Да и child_count
child_window
Тут, кст, фигня:
main_window_class().print_close_message()
Вы создаете новое окно и у него вызываете метод print_close_message
. Архитектурно, лучше окнам-детям передавать окно родителя и его использовать. В print_close_message
добавил параметр для объекта дочернего окна, в него виджет пишет самого себя, так родительское окно узнает что дочернее окно закрывается
Подправил код с учетом замечаний и рекомендаций:
import sys import traceback from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLineEdit, QMessageBox def log_uncaught_exceptions(ex_cls, ex, tb): text = '{}: {}:\n'.format(ex_cls.__name__, ex) text += ''.join(traceback.format_tb(tb)) print(text) QMessageBox. critical(None, 'Error', text) sys.exit(1) sys.excepthook = log_uncaught_exceptions class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Prog_1 Main Window") self.setGeometry(100, 100, 500, 500) self.btn1 = QPushButton("Создать дочернее окно", self) self.btn1.clicked.connect(self.btn1_on_click) self.btn1.setGeometry(0, 50, 300, 50) self.name_edit = QLineEdit("Ваш ник", self) self.name_edit.setGeometry(0, 0, 300, 50) self.child_windows = [] def print_close_message(self, child: 'ChildWindow'): self.child_windows.remove(child) print(f"кто-то сдох :-(\nнас осталось: {len(self.child_windows)}") def btn1_on_click(self): child_window = ChildWindow(self) child_window.show() self.child_windows.append(child_window) print(len(self.child_windows)) print("Нас стало:", len(self.child_windows)) idx = self.child_windows.index(child_window) print("Мой id:", idx) class ChildWindow(QMainWindow): def __init__(self, parent: MainWindow): super().__init__() self.parent = parent self.setWindowTitle("Prog_1 ChildWindow") self.setGeometry(100, 100, 500, 500) def closeEvent(self, event): event.accept() self.parent.print_close_message(self) def main(): app = QApplication(sys.argv) main_window = MainWindow() main_window.show() sys.exit(app.exec_()) if __name__ == "__main__": main()
Dynamic Creations Salon & Spa
Dynamic
Компания Dynamic Creations была создана для создания самых креативных причесок для таких людей, как вы. Если вы находитесь в районе Мельбурна или Палм-Бей и ищете Shampoo & Set, UpDo, Press, Dreads, Twist или Weave, Dynamic Creations — это заведение для вас.
Записаться на прием
Шампунь и набор | $45 и выше | |
Frontal — Closure Shampoo | $65 & up | |
Shampoo Weave | $55 & up | |
Trim | $15 & up | |
Haircut | $20 & up | |
Up- DO | $ 55 и UP | |
ЦВЕТ | ||
— 1 PROC | $ 25 & UP | |
— 2 Proc | $ 45 и повышение | |
$ 45 и повышение | ||
$ 45 и UP | ||
$15 & up | ||
Highlights | ||
— Full | $85 & up | |
— Partial | $45 & up | |
Crimps | $45 & up | |
Curl / Flat Iron | $35 и выше | |
Wand Curles | $45 и выше | |
Спираль/стержни | $65 и выше | 9012 9001 Релаксатор|
— Children | $65 | |
— Retouch | $75 & up | |
— Virgin | $80 & up | |
— Wave by Design | $75 & up | |
Protein Treatment | от 15 долларов | |
Кератиновое лечение | от 110 долларов | |
Wave Nouveau | от 75 долларов | 0011 |
Natural Hair | $35 & up | |
Comb Twist | $65 & up | |
Stuff Twist | $85 & up | |
Cornrows (Feed-in) | ||
Искусственные замки | 150 долларов США и более | |
Искусственные замки/дреды (ретушь) | 75 долларов США и более | |
Box Braids (Children) | $100 & up | |
Box Braids (Adults) | $155 & up | |
Loose Curl Crotchet | $125 & up | |
Pre-Twisted Crotchet | $ 85 и UP | |
Kinky Twist | $ 150 и UP | |
The Deant Twist (Дети) | $ 100 и UP | |
ВВОД ВОЗДЕЛА (ВОЛИТЕЛЬСТИ)0020 | ||
Micro Braids | $165 & up | |
Quick Weave | $75 & up | |
Weave per Track | $15 | |
Weave (Partial) | $135 & up | |
Плетение с закрытием | $ 145 и выше | |
360 Установка переплетения | $ 165 и UP | |
Кружевая фронтал | $ 85 и UP | 9001|
Quick Weave | $95 & up | |
Weave Removal | $25 & up | |
Wig Install | $85 & up | |
Custom Wig | $135 & up | |
Sew in ( Частичная) | $135 и выше | |
Вшивание (передняя надстройка) | $185 и выше | |
Вшивание (надстройка закрытия) | 9012и выше 1452 $0019 Вшивание (дополнение 360 Frontal) | $195 и выше |
Доставка наших продуктов для волос на дом.
ДИНАМИЧЕСКИЕ ТВОРЕНИЯ ДЛЯ ДОМА
908-444-9143
или начните оценку
Ожидайте самого лучшего от дома своей мечты. Мы, конечно, делаем.
ПОМОГИТЕ
ВАШ НАДЕЖНЫЙ СОВЕТНИК. ВАШ АДВОКАТ.
ВАШ СТРОИТЕЛЬ.
Строительство или ремонт дома вашей мечты должно быть волнующим и вдохновляющим моментом в вашей жизни. Когда у вас есть правильная профессиональная команда, это может быть. В Dynamic Home Creations наша цель ясна: поддержать вас как домовладельца и убедиться, что вы получаете максимальную отдачу на каждом этапе строительства.
Мы все здесь, чтобы создать идеальный конечный продукт, но и вы можете испытать Dynamic Home Creations. С Sims на вашей стороне вы можете расслабиться и насладиться творческим процессом, пока мы воплощаем вашу мечту в реальность.
Читать далее
Чем мы занимаемся
Вот как мы можем помочь вам построить дом, о котором вы всегда мечтали.
Может быть, вы все еще мечтаете. Может быть, вы уже по локоть в сборке, но вам нужна рука помощи. От консультации до закатывания рукавов, Dynamic Home Creations обладает опытом и навыками, чтобы довести ваш проект до конца, где бы вы ни находились в процессе. Позвольте нам использовать наш тридцатилетний опыт индивидуального строительства роскошных домов для вас.
Полная реконструкция кухни
Полная реконструкция кухни
Стоимость рабочей силы зависит от объема, местоположения и сложности проекта, но стоимость рабочей силы обычно составляет около 25-35% от общей стоимости проекта.
Забронируйте встречу
Полная реконструкция подвала
Полная реконструкция подвала
Оценка затраты на подвальный реконструкция за кв. Фута 500 SF = $ 20K
Книга Antainment
ОДИНГ. преимущества расширенного жилого пространства на открытом воздухе, палуба может фактически увеличить стоимость вашего дома. В среднем вы можете окупить около 70-80% ваших инвестиций в качественную колоду.
Записаться на прием
Стоимость реконструкции кровли
Стоимость реконструкции кровли
Кровля 325 долларов США за квадрат (100 кв. футов) и более высокая цена 500 долларов США за квадрат (100 квадратных футов)
Записаться на прием
Полный ремонт дома
Полная реконструкция ванной комнаты
Стоимость рабочей силы зависит от объема, местоположения и сложности проекта, но стоимость рабочей силы обычно составляет около 25-35% от общей стоимости проекта
Записаться на прием
Реконструкция дверей
Реконструкция дверей
Стоимость рабочей силы зависит от объема, местоположения и сложности проекта, но стоимость рабочей силы обычно составляет около 25-35% от общей стоимости проекта
Записаться на прием
Реконструкция окон
Модернизация Windows
Установка окон стоит всего 225 долларов за окно при обычной новой установке. Более дорогой вариант стоит 500 долларов за полную замену.
Записаться на прием
Служба доставки контейнеров
Услуга Roll Off Containers
500 долларов США 14-ярдовый контейнер, 10-дневное использование, лимит 2 тонны.
Записаться на прием
Переделка дверей патио
Переделка дверей патио
Стоимость рабочей силы зависит от объема, местоположения и сложности проекта, но стоимость рабочей силы обычно составляет около 25-35% от общей стоимости проекта
Записаться на прием
Богатый опыт на вашей стороне
Lorem Ipsum — это просто фиктивный текст полиграфической и наборной промышленности. Lorem Ipsum был стандартным фиктивным текстом в отрасли с 1500-х годов, когда неизвестный печатник взял гранку шрифта и перемешал ее, чтобы сделать книгу образцов шрифтов. Он пережил не только пять столетий, но и скачок в электронный набор текста, оставаясь практически неизменным.
Узнать больше
Почему вы должны выбрать нас
Цена соответствует цене
Нашли дешевле? Сообщите нам, и мы будем рады вам помочь. ожидания
Своевременная доставка
Быстрый бесшовный процесс планирования, проектирования и строительства без скрытых сюрпризов в конце 5 лет совокупного опыта
Восхищение наших клиентов
Всегда превосходя ожидания клиентов и поддерживая их на каждом этапе процесса, мы стали уважаемой компанией, о чем свидетельствуют их отзывы.
Отзыв
Мои клиенты говорят
Каждый проект начинается с разговора
Мы превращаем идеи в замечательные пространства, а Dynamic Home Creations не соответствует размеру или бюджету проекта.