typescript - Angular 2-komponentvariabel i provide


Kan en komponent tillhandahålla en tjänst (eller något som kan tillhandahållas) baserat på dess ingångar? I mitt fall använder min komponent en tjänst baserat på en annan Firebase-tjänst och jag vill att komponenten ska tillhandahålla en ny Firebase-tjänst med ett barn, så att den andra tjänsten endast kommer åt barnets del i databasen.

I min nuvarande lösning kallar min komponent tjänstens setChild-funktion för att sätta barnet, men jag är nyfiken på om det är möjligt på det sätt som beskrivs ovan.

Tack, Tamas

Svar #1

Nej, det är inte möjligt. När dekoratorargumenten utvärderas finns det ännu ingen instans av komponenten.

Vad du däremot kan göra är att injicera tjänsten till komponenten där den läggs till bland leverantörerna, och skicka värdet till tjänsten. När ett barn också injicerar samma tjänst, delar de samma värde:

@Injectable()
class MyService {
  ... 
}

@Component({
  selector: 'parent',
  template: 'x'
  providers: [MyService],
)}
class Parent {
  @Input() someInput;

  constructor(private myService:MyService) {
  }

  ngOnChanges() {
    this.myService.sharedValue = this.someInput;
  }
}

@Component({
  selector: 'descendant',
  template: 'x'
)}
class Descendant {
  constructor(myService:MyService) {
    myService.sharedValueChange.subscribe(val => {
      console.log(val);
    });
  }
}

för mer information om att skapa en delad tjänst med Observable för att meddela om förändringar, se Delegation: EventEmitter eller Observable i Angular2