У меня есть два компонента следующим образом, и я хочу вызвать функцию из другого компонента. Оба компонента включены в третий родительский компонент с помощью директивы.
Компонент 1:
@component(
selector:'com1'
)
export class com1{
function1(){...}
}
Компонент 2:
@component(
selector:'com2'
)
export class com2{
function2(){...
// i want to call function 1 from com1 here
}
}
Я попытался с помощью @input
и , @output
но я не понимаю , как именно использовать его и как вызывать эту функцию, кто может помочь?
angular
angular2-components
noobProgrammer
источник
источник
Ответы:
Если com1 и com2 - братья и сестры, вы можете использовать
com2 испускает событие, используя
EventEmitter
Здесь родительский компонент добавляет привязку события для прослушивания
myEvent
событий, а затем вызывает,com1.function1()
когда такое событие происходит.#com1
переменная шаблона, которая позволяет ссылаться на этот элемент из других частей шаблона. Мы используем это , чтобыfunction1()
обработчик событий дляmyEvent
изcom2
:Для других вариантов взаимодействия между компонентами см. Также взаимодействие компонентов
источник
<sibling1 (myEvent)="...">
это привязка события для родителя / хоста, потому что это единственный способ, который обеспечивает Angular. Однако обработчик событий вызывает метод для другого sibling (com1
). Родитель используется в качестве посредника.somecomponent.ts
?Во-первых, что вам нужно, чтобы понять отношения между компонентами. Тогда вы можете выбрать правильный способ общения. Я попытаюсь объяснить все методы, которые я знаю и использую в своей практике для взаимодействия между компонентами.
Какие могут быть отношения между компонентами?
1. Родитель> Ребенок
Обмен данными через ввод
Это, наверное, самый распространенный способ обмена данными. Он работает с помощью
@Input()
декоратора, чтобы данные могли быть переданы через шаблон.parent.component.ts
child.component.ts
Это очень простой метод. Это простой в использовании. Мы также можем отслеживать изменения данных в дочернем компоненте с помощью ngOnChanges .
Но не забывайте, что если мы используем объект в качестве данных и изменяем параметры этого объекта, ссылка на него не изменится. Следовательно, если мы хотим получить модифицированный объект в дочернем компоненте, он должен быть неизменным.
2. Ребенок> Родитель
Обмен данными через ViewChild
ViewChild позволяет вводить один компонент в другой, предоставляя родительскому доступу к его атрибутам и функциям. Однако одно предостережение заключается в том, что
child
он не будет доступен до тех пор, пока представление не будет инициализировано. Это означает, что нам нужно реализовать хук жизненного цикла AfterViewInit для получения данных от дочернего элемента.parent.component.ts
child.component.ts
Совместное использование данных через Output () и EventEmitter
Другим способом обмена данными является отправка данных от дочернего элемента, которые могут быть перечислены родителем. Этот подход идеален, когда вы хотите поделиться изменениями данных, которые происходят при таких вещах, как нажатие кнопок, записи форм и другие пользовательские события.
parent.component.ts
child.component.ts
3. Братья и сестры
Ребенок> Родитель> Ребенок
Я пытаюсь объяснить другие способы общения между братьями и сестрами ниже. Но вы уже могли понять один из способов понимания вышеуказанных методов.
parent.component.ts
дети-one.component.ts
дети-two.component.ts
4. Несвязанные компоненты
Все методы, которые я описал ниже, могут быть использованы для всех вышеупомянутых опций для связи между компонентами. Но у каждого есть свои преимущества и недостатки.
Обмен данными с сервисом
При передаче данных между компонентами, которые не имеют прямого соединения, такими как братья и сестры, внуки и т. Д., Вы должны использовать общую службу. Когда у вас есть данные, которые всегда должны быть синхронизированы, я считаю, что RxJS BehaviorSubject очень полезен в этой ситуации.
data.service.ts
first.component.ts
second.component.ts
Обмен данными с маршрутом
Иногда вам нужно не только передавать простые данные между компонентами, но и сохранять некоторое состояние страницы. Например, мы хотим сохранить фильтр на онлайн-рынке, а затем скопировать эту ссылку и отправить другу. И мы ожидаем, что он откроет страницу в том же состоянии, что и мы. Первый и, возможно, самый быстрый способ сделать это - использовать параметры запроса. .
Параметры запроса более похожи на то,
/people?id=
гдеid
может быть что угодно, и вы можете иметь столько параметров, сколько захотите. Параметры запроса будут разделены символом амперсанда.При работе с параметрами запроса вам не нужно определять их в файле маршрутов, и они могут называться параметрами. Например, возьмите следующий код:
page1.component.ts
На странице получения вы получите эти параметры запроса, такие как:
page2.component.ts
NgRx
Последний способ, который является более сложным, но более мощным, заключается в использовании NgRx . Эта библиотека не для обмена данными; это мощная государственная библиотека управления. Я не могу в коротком примере объяснить, как его использовать, но вы можете зайти на официальный сайт и прочитать документацию об этом.
Для меня NgRx Store решает несколько проблем. Например, когда вам приходится иметь дело с наблюдаемыми и когда ответственность за некоторые наблюдаемые данные распределяется между различными компонентами, действия хранилища и редуктор гарантируют, что изменения данных всегда будут выполняться «правильным образом».
Он также обеспечивает надежное решение для кэширования HTTP-запросов. Вы сможете хранить запросы и их ответы, чтобы убедиться, что на ваш запрос еще не сохранен ответ.
Вы можете прочитать о NgRx и понять, нужно ли вам это в вашем приложении или нет:
Наконец, я хочу сказать, что перед выбором некоторых методов обмена данными вам необходимо понять, как эти данные будут использоваться в будущем. Я имею в виду, может быть, только сейчас вы можете использовать только
@Input
декоратор для обмена именем пользователя и фамилией. Затем вы добавите новый компонент или новый модуль (например, панель администратора), который нуждается в дополнительной информации о пользователе. Это означает, что это может быть лучшим способом использования службы для пользовательских данных или каким-либо другим способом обмена данными. Вы должны подумать об этом больше, прежде чем начать осуществлять обмен данными.источник
Вы можете получить доступ к методу компонента один из компонента два ..
ComponentOne
componentTwo
componentTwo HTML-файл
источник
Компонент 1 (дочерний):
Компонент 2 (родитель):
источник
@ViewChild
который работал для меня. Спасибо за этот пример.Это зависит от отношения между вашими компонентами (родительский / дочерний), но лучший / универсальный способ создания коммуникационных компонентов - это использование общей службы.
Смотрите этот документ для более подробной информации:
При этом вы можете использовать следующее для предоставления экземпляра com1 в com2:
В com2 вы можете использовать следующее:
источник
@Input
на поле?<button (click)="dbgraph.displayTableGraph()">Graph</button> <dbstats-graph #dbgraph></dbstats-graph>
Обратите внимание на локальную переменную
#dbgraph
дочернего компонента, которую родитель может использовать для доступа к своим методам (dbgraph.displayTableGraph()
).источник
Используя Dataservice, мы можем вызвать функцию из другого компонента.
Component1: компонент, который мы называем функцией
dataservice.ts
Component2: компонент, который содержит функцию
источник
if ( this.bookmarkRoot.callToggle.observers.length === 0 ) { this.bookmarkRoot.callToggle.subscribe(( data ) => { this.closeDrawer(); } ) }