26

我想创建可以与一个组件交互的服务。我的应用程序中的所有其他组件都应该能够调用此服务,并且此服务应与此组件交互。

如何从服务中调用组件方法?

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

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

从此服?

@Injectable()

export class Service {


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

3 回答 3

30

组件之间的交互确实可以使用服务来实现。您需要将用于组件间通信的服务使用注入到所有需要使用它的组件(所有调用方组件和被调用方方法)中,并利用 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();
  }
}

例子:

发件人:

callMethod = function () {
   this.communicationService.callComponentMethod();
}

接收者:

this.communicationService.componentMethodCalled$.subscribe(() => {
      alert('(Component2) Method called!');
});

我在这里创建了一个基本示例,单击 Component1 中的按钮将调用 Component2 中的方法。

如果您想阅读有关该主题的更多信息,请参阅专用文档部分:https ://angular.io/guide/component-interaction#parent-and-children-communicate-via-a-service

于 2016-11-24T14:30:19.147 回答
12

该问题不要求组件交互,它要求从服务调用组件方法

这可以通过向组件注入服务来实现。然后在服务内部定义一个以函数为参数的方法。该方法应该将此函数保存为服务的属性,并在任何需要的地方调用它。

// -------------------------------------------------------------------------------------
// 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
  }
}
于 2019-09-03T07:10:57.900 回答
3

由于这篇文章有点旧,我实现了 Tudor the stackblitz的响应

服务

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");
  }
于 2019-08-27T06:47:32.557 回答