Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Observable

Imagine duas classes A e B, a classe A roda uma função que atualiza uma variável X, gostaria que a classe B observasse a classe esta variável X da classe A, eu sempre usei observables para observar algo que ja existe, neste caso fiquei um pouco perdido pq tenho que fazer a minha variável ser observável, sendo que esta mesma variável é utilizada por algumas funções dentro da classe A, eu até poderia fazer um pooling na classe B para acessar esta variável da classe A, mas faz eu me sentir muito amador... Não conseguirei estudar a fundo isso agora, são 4AM e eu estou ultra enrolado com reunião às 10AM, se tiverem como dar uma luz eu preciso de ajuda para ganhar tempo, porém precisarei focar nisso nos próximos dias...

Desde já obrigado.

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
4 respostas

Hola Maurício,

Acho que o mais simples seria deixar essa variável X em um serviço.

A variável X poderia ser tanto um Observable como um EventEmitter, onde as funções A e B se inscrevam nessa variável e se utilizem do valor.

Obrigado pela atenção Priscila, acabei de acordar e tenho que focar em deixar uma parte do app funcional, fiz um pooling e a classe B consulta a variável X na classe A, se vc tiver como colocar um exemplo eu fico grato, ainda não consegui parar para focar nisso, mas quero tentar aprender melhor sobre o assunto no máximo ate amanhã.

solução!

Mauricio,

Poderia ficar algo assim:

Service:

my-service.service.ts

import { Injectable, EventEmitter } from '@angular/core';

@Injectable()
export class MyServiceService {

  public myEmitter: EventEmitter<boolean> = new EventEmitter<boolean>();

}

No serviço, é criado uma variável pública, que nesse caso é um emissor de eventos. Por ser um emissor de eventos, qualquer component que injete o serviço é capaz de se inscrever nela.

Components:

my-component.component.ts

import { Component, OnInit } from '@angular/core';
import { MyServiceService } from '../my-service.service';

@Component({
  selector: 'app-my-component',
  templateUrl: './my-component.component.html',
  styleUrls: ['./my-component.component.css']
})
export class MyComponentComponent implements OnInit {

  myVar: boolean;

  constructor(private _myService: MyServiceService) { }

  ngOnInit() {
    this._myService.myEmitter.subscribe(data => this.myVar = data);
  }

  mudarValor() {
    this._myService.myEmitter.emit(true);
  }

}

No component, é injetado o serviço myServiceService, onde está a variável criada. No ngOnInit(), estamos se inscrevendo na variável myEmitter criada no myServiceService, e toda vez que algo for emitido por essa variável, o valor emitido será passado para a variável local myVar. A função mudaValor() se utiliza da variável myEmitter para emitir uma informação para todos que estiverem inscritos nesta variável.

my-component.component.html

<button (click)="mudarValor()">Mudando o valor do myEmitter para true</button>

<p>Valor da variável myEmitter é: {{ myVar }}</p>

No template, é possível ver o valor da variável myEmitter sendo modificado.

my-component2.component.ts

import { Component, OnInit } from '@angular/core';
import { MyServiceService } from '../my-service.service';

@Component({
  selector: 'app-my-component2',
  templateUrl: './my-component2.component.html',
  styleUrls: ['./my-component2.component.css']
})
export class MyComponent2Component implements OnInit {

  myVar: boolean;

  constructor(private _myService: MyServiceService) { }

  ngOnInit() {
    this._myService.myEmitter.subscribe(data => this.myVar = data);
  }

  mudarValor() {
    this._myService.myEmitter.emit(false);
  }
}

No component my-component2.component.ts, é feito a mesma rotina que o my-component.component.ts, só passando um novo valor para o myEmitter.

my-component2.component.ts

<button (click)="mudarValor()">Mudando o valor do myEmitter para false</button>

<p>Valor da variável myEmmiter é: {{ myVar }}</p>

Funciona da mesma forma que o template do my-component.component.html.

Boa, acabe seguindo por este caminho. Obrigado