Pesquisa de site

typescript - Conexão entre duas visualizações de componentes Angular 2 não está atualizando


Eu tenho uma pequena variação da pergunta postada aqui: a visualização do componente Angular2 não atualiza quando o valor é alterado via método.

Eu quero alternar uma variável no componente modal a partir do componente de botões de alternância, mas a visualização não é atualizada.

Como posso fazer a visualização modal atualizar quando eu clicar no botão de alternância?

Veja para referência: plunkr

app.ts

//our root app component
import {Component, ViewChild} from 'angular2/core';
import {Modal} from './modal';
import {ToggleButtons} from './togglebuttons';

@Component({
  selector: 'my-app',
  template: `
    <div>

       <toggle-buttons></toggle-buttons>

       <modal></modal>

    </div>
  `,
  providers: [Modal, ToggleButtons, ],
})
export class App {
  constructor() {

  }
}

togglebuttons.ts

//our root app component
import {Component} from 'angular2/core';
import {Modal} from './modal';

@Component({
  selector: 'toggle-buttons',
  template: `
    <div>

      <button (click)="toggle()">toggle</button>

      <button (click)="showActivate()">print</button>

    </div>
  `
})
export class ToggleButtons {
  constructor(private modal: Modal) {

  }

  showActivate() {
    this.modal.showActivate();
  }

  toggle() {
    this.modal.toggleActivate();
  }
}

modal.ts

//our root app component
import {Component, Injectable} from 'angular2/core'

@Component({
  selector: 'modal',
  template: `
    <div>
      <h2>Modal: {{activate}}</h2>
    </div>
  `,
  directives: []
})

export class Modal {

  activate: true;

  constructor() {
    this.activate = false;
  }

  showActivate() {
    console.log('Modal:showActivate', this.activate);
  }

  toggleActivate() {
    this.activate = !this.activate;
    console.log('Modal:toggleActivate', this.activate);

    console.log(this.activate)
  }
}

Resposta #1

Você precisa referenciar o modal e fornecê-lo como entrada para o seu componente Toggle:

@Component({
  selector: 'my-app',
  template: `
    <div>
      <toggle-buttons [modal]="modal"></toggle-buttons>
      <modal></modal>
    </div>
  `,
  directives: [Modal, ToggleButtons],
})
export class App {
  @ViewChild(Modal)
  modal: Modal;

  constructor() {

  }
}

Esta entrada deve ser definida assim em seu componente Toggle:

@Component({
  (...)
})
export class ToggleButtons {
  @Input()
  modal:Modal;

  (...)
}

Veja este plunkr: https://plnkr.co/edit/3t5xo9Y6N8iEL4eqw9Gn?p=preview.

Resposta #2

A instância Modal injetada em

export class Toggle {
  constructor(private modal: Modal) {

  }

é alguma instância arbitrária criada pelo Angular DI e não está relacionada ao elemento <modal></modal> de forma alguma, portanto chamar ou alterar propriedades não tem nenhum efeito na visualização do App