当前位置: 首页 > 知识库问答 >
问题:

角2服务调用方法从组件

盖嘉庆
2023-03-14

甚至可以让服务调用组件方法吗?

myapp.component

export class MyAppComponent {
  public value;
  ...
  public setValue(payload){
    this.value = payload;
  }
}

myapp.service

@Injectable()
export class MyAppService {
  private myAppComponent: MyAppComponent;
  private apiClientService: ApiClientService

  // ...
    After i make an PUT http call, the body from the response is my new "value"
  // ...

    putValue(payload: JSON){

    return this.apiClientService.putAPIObject(payload).then((response) => {
      this.myAppComponent.setValue(response);
    }); 
  }
}

这将导致一个错误:Uncaught(在promise中):TypeError:无法读取未定义的的属性“setValue”。

有人能解释我做错了什么吗?提前谢谢。

编辑:由于人们抱怨我的方法,如果有人能向我解释什么是处理这个问题的最佳方法,我完全可以从头开始。

我从api中获取值,更改它们,然后将它们放回api。我不想再次进行get调用,因此我在Put调用的响应中获得了所需的新数据。

呼叫从组件发出

我想问题是在起点和终点之间我有一个额外的服务。

编辑2:我试图避免使用组件服务,只使用组件就可以了--

即使这个灵魂在我不喜欢的时候也对我有用,因为我必须从我的api中用其他对象复制和粘贴许多相同“操作”的代码。例如,我让它为图片组件工作,但我也需要这个为我的电影组件。通常情况下,如果我在一个项目中经常写相同的代码,这是一件坏事,或者不是?


共有1个答案

燕靖
2023-03-14

至少有几种方法可以解决这个问题,但希望这能给你一个开始。接受反馈和纠正。

让服务自身对价值的认知发生变化,发出变化。组件监听 <罢工> 一个事件发射器 1服务对值变化做出反应。(另请参阅:从Angular 2服务创建和返回可观察)

MyAppService

import { Subject } from 'rxjs/Subject';

@Injectable()
export class MyAppService {
  private valueSource = new Subject<any>();
  public valueUpdate$ = this.valueSource.asObservable();

  putValue(payload: JSON){
    return this.apiClientService.putAPIObject(payload).then((response) => {
      /** here **/
      this.valueUpdate$.next(response);
    }); 
  }
}

MyAppComponent

export class MyAppComponent {
  public value;
  private valueSubscription;

  constructor(private _myAppService: MyAppService) {}

  ngOnInit() {
    /** and here **/
    this._myAppService.valueUpdate$.subscribe((p) => this.setValue(p));
  }
  ...
  public setValue(payload){
    this.value = payload;
  }
}

回答最初的问题,我们的想法是向服务注册组件,以便它可以根据需要调用组件。您可以通过依赖项注入获取引用,但不推荐(例如,如果您的原始组件引用被破坏了怎么办?)

MyAppService

@Injectable()
export class MyAppService {
  private myAppComponent: MyAppComponent;

  /** here **/
  registerMyApp(myApp: MyAppComponent) {
    this.myAppComponent = myApp;
  }

  putValue(payload: JSON){
    return this.apiClientService.putAPIObject(payload).then((response) => {
      this.myAppComponent.setValue(response);
    }); 
  }
}

MyAppComponent

export class MyAppComponent {
  public value;

  /** and here **/
  constructor(myAppService: MyAppService) {
    myAppService.registerMyApp(this);
  }
  ...
  public setValue(payload){
    this.value = payload;
  }
}
  1. 感谢AJT_82指出Angular不希望开发人员在服务上使用EventEmitter:EventEmitter的正确用法是什么
 类似资料:
  • 问题内容: 在我的Angular 2应用中,我具有以下后端服务。 调用此服务后,我想在上一个成功的情况下调用另一个服务。 第二次服务 这两个服务分别返回两个JSON数组。然后,我需要使用这两个数组进行一些登录。 已编辑 服务 然后,我在其他ts文件中使用following来调用服务。 但这会在控制台日志上出现以下错误。 任何建议表示赞赏。 问题答案: 您需要利用操作员在前一个请求完成后调用一个请求

  • 使用Angular 2更改值时,如何调用方法? 我尝试使用ng change,但没有成功。

  • 问题内容: 我是Node.js的新手,但是通过使用它我对套接字流Web框架有了一些了解,我可以轻松地从JavaScript调用服务器端的node.js方法。不使用该框架,我不知道该怎么做。如何从JavaScript调用node.js方法? 以下代码使用套接字流调用服务器端方法。因此,我想在不使用此框架的情况下调用相同的服务器端方法。 问题答案: 我建议使用Socket.IO 服务器端代码 和客户端

  • 问题内容: 我想从React元素的实例中调用React组件公开的方法。 例如,在此jsfiddle中。我想从参考中调用该方法。 有没有一种方法可以实现而无需编写其他包装程序? 编辑 (从JSFiddle复制的代码) 问题答案: 有两种访问内部函数的方法。一个实例级别,如您所愿,另一个静态级别。 实例 您需要在从返回时调用函数。见下文。 静态的 看一下ReactJS Statics。但是请注意,静态

  • 问题内容: 假设我有一个具有子组件的主Vue实例。是否可以从Vue实例外部完全调用属于这些组件之一的方法? 这是一个例子: 因此,当我单击内部按钮时,该方法绑定到其click事件,因此将被调用。无法将事件绑定到外部按钮,我正在使用jQuery监听其单击事件,因此我需要其他一些调用方法。 编辑 看来这可行: 但是,这不是一个好的解决方案,因为我是通过子数组中的索引来引用该组件的,而对于许多组件而言,

  • 我有一个包含服务方法的报警服务服务类。这些方法在警报服务激活时被调用。我想做的是调用这些方法中的另一个类的意图,这些方法在服务类中被调用(当警报关闭时)。它所做的只是在调用意图时标记错误。这只发生在激活警报服务时调用的方法中(服务类中的方法)。这是因为类而不是吗?我不确定,有什么想法吗? (以下是我的服务类,当在方法中调用另一个活动的意图时,应用程序强制关闭。) LogCat上的这些错误之一是: