Eu tenho dois componentes da seguinte maneira e quero chamar uma função de outro componente. Ambos os componentes estão incluídos no terceiro componente pai usando a diretiva.
Componente 1:
@component(
selector:'com1'
)
export class com1{
function1(){...}
}
Componente 2:
@component(
selector:'com2'
)
export class com2{
function2(){...
// i want to call function 1 from com1 here
}
}
Eu tentei usar @input
e, @output
mas não entendo exatamente como usá-lo e como chamar essa função, alguém pode ajudar?
angular
angular2-components
noobProgrammer
fonte
fonte
Respostas:
Se com1 e com2 são irmãos, você pode usar
com2 emite um evento usando um
EventEmitter
Aqui, o componente pai adiciona uma ligação de evento para escutar
myEvent
eventos e depois chamacom1.function1()
quando esse evento acontece.#com1
é uma variável de modelo que permite se referir a esse elemento de qualquer outra parte do modelo. Nós usamos isso para fazerfunction1()
o manipulador de eventos paramyEvent
decom2
:Para outras opções de comunicação entre componentes, consulte também interação com componentes
fonte
<sibling1 (myEvent)="...">
é uma ligação de evento para o pai / host, porque é a única maneira que o Angular fornece. O manipulador de eventos, no entanto, chama um método no outro irmão (com1
). O pai é usado como mediador.somecomponent.ts
?Primeiro, o que você precisa para entender os relacionamentos entre os componentes. Então você pode escolher o método certo de comunicação. Vou tentar explicar todos os métodos que eu conheço e uso na minha prática para a comunicação entre componentes.
Que tipos de relacionamentos entre componentes podem existir?
1. Pai> Filho
Compartilhando dados via entrada
Este é provavelmente o método mais comum de compartilhamento de dados. Ele funciona usando o
@Input()
decorador para permitir que os dados sejam transmitidos pelo modelo.parent.component.ts
child.component.ts
Este é um método muito simples. É fácil de usar. Também podemos capturar alterações nos dados no componente filho usando ngOnChanges .
Mas não esqueça que se usarmos um objeto como dados e alterarmos os parâmetros desse objeto, a referência a ele não será alterada. Portanto, se queremos receber um objeto modificado em um componente filho, ele deve ser imutável.
2. Criança> Pai
Compartilhando dados via ViewChild
O ViewChild permite que um componente seja injetado em outro, dando ao pai acesso a seus atributos e funções. Uma ressalva, no entanto, é que
child
não estará disponível até que a visualização tenha sido inicializada. Isso significa que precisamos implementar o gancho do ciclo de vida AfterViewInit para receber os dados do filho.parent.component.ts
child.component.ts
Compartilhando dados via Output () e EventEmitter
Outra maneira de compartilhar dados é emitir dados do filho, que podem ser listados pelos pais. Essa abordagem é ideal quando você deseja compartilhar alterações de dados que ocorram em itens como cliques em botões, entradas de formulário e outros eventos do usuário.
parent.component.ts
child.component.ts
3. irmãos
Criança> Pai> Criança
Eu tento explicar outras maneiras de se comunicar entre irmãos abaixo. Mas você já pode entender uma das maneiras de entender os métodos acima.
parent.component.ts
child-one.component.ts
child-two.component.ts
4. Componentes não relacionados
Todos os métodos que descrevi abaixo podem ser usados para todas as opções acima para o relacionamento entre os componentes. Mas cada um tem suas próprias vantagens e desvantagens.
Compartilhando dados com um serviço
Ao transmitir dados entre componentes que não possuem conexão direta, como irmãos, netos, etc., você deve usar um serviço compartilhado. Quando você tem dados que sempre devem estar sincronizados, acho o RxJS BehaviorSubject muito útil nessa situação.
data.service.ts
first.component.ts
second.component.ts
Compartilhando dados com uma rota
Às vezes, você precisa não apenas passar dados simples entre os componentes, mas salvar algum estado da página. Por exemplo, queremos salvar algum filtro no mercado on-line, copiar esse link e enviar para um amigo. E esperamos que ela abra a página no mesmo estado que nós. A primeira, e provavelmente a mais rápida, maneira de fazer isso seria usar parâmetros de consulta .
Os parâmetros de consulta são mais parecidos com
/people?id=
ondeid
pode ser qualquer coisa e você pode ter quantos parâmetros desejar. Os parâmetros da consulta seriam separados pelo caractere e comercial.Ao trabalhar com parâmetros de consulta, você não precisa defini-los no arquivo de rotas e eles podem ser nomeados parâmetros. Por exemplo, pegue o seguinte código:
page1.component.ts
Na página de recebimento, você receberá esses parâmetros de consulta como os seguintes:
page2.component.ts
NgRx
A última maneira, que é mais complicada, mas mais poderosa, é usar o NgRx . Esta biblioteca não é para compartilhamento de dados; é uma poderosa biblioteca de gerenciamento de estado. Em um breve exemplo, não posso explicar como usá-lo, mas você pode ir ao site oficial e ler a documentação sobre ele.
Para mim, a NgRx Store resolve vários problemas. Por exemplo, quando você precisa lidar com observáveis e quando a responsabilidade por alguns dados observáveis é compartilhada entre diferentes componentes, as ações da loja e o redutor garantem que as modificações dos dados sempre sejam executadas "da maneira certa".
Ele também fornece uma solução confiável para o cache de solicitações HTTP. Você poderá armazenar os pedidos e suas respostas, para poder verificar se o pedido que você está fazendo ainda não tem uma resposta armazenada.
Você pode ler sobre o NgRx e entender se precisa ou não no seu aplicativo:
Finalmente, quero dizer que, antes de escolher alguns dos métodos para compartilhar dados, você precisa entender como esses dados serão usados no futuro. Quero dizer, talvez agora você possa usar apenas um
@Input
decorador para compartilhar um nome de usuário e sobrenome. Em seguida, você adicionará um novo componente ou novo módulo (por exemplo, um painel de administração) que precisa de mais informações sobre o usuário. Isso significa que pode ser uma maneira melhor de usar um serviço para dados do usuário ou alguma outra maneira de compartilhar dados. Você precisa pensar mais sobre isso antes de começar a implementar o compartilhamento de dados.fonte
Você pode acessar o método do componente a partir do componente dois.
componentOne
componentTwo
componentTwo arquivo html
fonte
Componente 1 (filho):
Componente 2 (pai):
fonte
@ViewChild
que funcionou para mim. Obrigado por este exemplo.Depende da relação entre seus componentes (pai / filho), mas a melhor maneira / genérica de criar componentes de comunicação é usar um serviço compartilhado.
Consulte este documento para obter mais detalhes:
Dito isto, você pode usar o seguinte para fornecer uma instância do com1 no com2:
No com2, você pode usar o seguinte:
fonte
@Input
o campo?<button (click)="dbgraph.displayTableGraph()">Graph</button> <dbstats-graph #dbgraph></dbstats-graph>
Observe a variável local
#dbgraph
no componente filho, que o pai pode usar para acessar seus métodos (dbgraph.displayTableGraph()
).fonte
Usando o Dataservice, podemos chamar a função de outro componente
Componente1: O componente que estamos chamando de função
dataservice.ts
Componente2: O componente que contém a função
fonte
if ( this.bookmarkRoot.callToggle.observers.length === 0 ) { this.bookmarkRoot.callToggle.subscribe(( data ) => { this.closeDrawer(); } ) }