Как вызвать метод компонента из службы? (angular2)

Я хочу создать сервис, который может взаимодействовать с одним компонентом. Все остальные компоненты моего приложения должны иметь возможность вызвать эту службу, и эта служба должна взаимодействовать с этим компонентом.

Как вызвать метод компонента из службы?

@Component({
  selector:'component'
})
export class Component{

  function2(){ 
    // How call it?
  }
}

Из этого служения?

@Injectable()

export class Service {


  callComponentsMethod() {
    //From this place?;
      }
}

Ответ 1

Взаимодействие между компонентами действительно может быть достигнуто с использованием служб. Вам нужно будет внедрить сервисное обслуживание для межкомпонентной связи во все компоненты, которые должны будут использовать его (все компоненты вызывающего абонента и метод вызываемого абонента) и использовать свойства Observables.

Общая служба может выглядеть примерно так:

import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';

@Injectable()
export class CommunicationService {

  // Observable string sources
  private componentMethodCallSource = new Subject<any>();

  // Observable string streams
  componentMethodCalled$ = this.componentMethodCallSource.asObservable();

  // Service message commands
  callComponentMethod() {
    this.componentMethodCallSource.next();
  }
}

Я создал базовый пример здесь, где щелчок по кнопке из Component1 вызовет метод из Component2.

Если вы хотите прочитать больше по этому вопросу, обратитесь к разделу специальной документации: https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service

Ответ 2

Вопрос не задает взаимодействие с компонентом, он просит вызвать метод компонента из службы.

Этого просто можно достичь, внедрив услугу в компонент. Затем определите метод внутри службы, который принимает функцию в качестве параметра. Метод должен сохранить эту функцию как свойство службы и вызывать ее там, где он хочет.

// -------------------------------------------------------------------------------------
// codes for component
import { JustAService} from '../justAService.service';
@Component({
  selector: 'app-cute-little',
  templateUrl: './cute-little.component.html',
  styleUrls: ['./cute-little.component.css']
})
export class CuteLittleComponent implements OnInit {
  s: JustAService;
  a: number = 10;
  constructor(theService: JustAService) {
    this.s = theService;
  }

  ngOnInit() {
    this.s.onSomethingHappended(this.doThis.bind(this));
  }

  doThis() {
    this.a++;
    console.log('yuppiiiii, ', this.a);
  }
}
// -------------------------------------------------------------------------------------
// codes for service
@Injectable({
  providedIn: 'root'
})
export class JustAService { 
  private myFunc: () => void;
  onSomethingHappended(fn: () => void) {
    this.myFunc = fn;
    // from now on, call myFunc wherever you want inside this service
  }
}

Ответ 3

поскольку этот пост немного устарел, я актуализирую ответ тудора стекаблиц

сервис

private customSubject = new Subject<any>();
  customObservable = this.customSubject.asObservable();

  // Service message commands
  callComponentMethod(value:any) {
    this.customSubject.next(value);
  }

основной компонент

constructor(private communicationService:CommunicationService){}
  ngOnInit()
  {
    this.communicationService.customObservable.subscribe((res) => {
          this.myFunction(res)
        }
      );
  }
  myFunction(res:any)
  {
    alert(res)
  }

Еще один компонент, который вызывает метод службы

constructor( private communicationService: CommunicationService  ) { }

  click() {
    this.communicationService.callComponentMethod("hello word");
  }