javascript - Angular 服务是否可以直接更改注入(inject)它的组件的属性(没有商店/RxJs)?

标签 javascript angular typescript

Dashboard.component.ts

import { DragAndDropService } from '../api/services/drag-and-drop.service';

export class DashboardComponent {
  myProperty = "hello"

  constructor(private dragAndDropService: DragAndDropService) {}

  ngOnInit() {
    this.dragAndDropService.alterMyProperty()
  }
}

DragAndDropService.service.ts

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

@Injectable({
  providedIn: 'root'
})
export class DragAndDropService {

  alterMyProperty() {
    this.myProperty = "New String we are trying to alter";
  }
}

因此,由于范围的原因,这当然是行不通的。该服务将在它自己的类中查找“this.myProperty”。但是有没有办法让它默认到实例化的范围(在这种情况下,Dashboard.component 的构造函数)?

这个例子非常简单,为了简洁我省略了代码。我的实际代码比这复杂得多。

最佳答案

我不确定您为什么不想使用 Rxjs。但这会让您的生活变得轻松。

您可以从服务本身设置组件的属性。

试试这个:

Dashboard.component.ts

import { DragAndDropService } from '../api/services/drag-and-drop.service';

export class DashboardComponent {
  myProperty = "hello"

  constructor(private dragAndDropService: DragAndDropService) {}

  ngOnInit() {
    this.dragAndDropService.alteredProperty$
      .subscribe(alertedProperty => this.myProperty = alertedProperty);
  }
}

DragAndDropService.service.ts

import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class DragAndDropService {

  private alteredProperty: BehaviorSubject<string> = new BehaviorSubject<string>(null);
  alteredProperty$: Observable<string> = this.alteredProperty.asObservable();

  alterMyProperty(alteredProperty) {
    this.alteredProperty.next(alteredProperty);
  }
}

您现在可以在任何地方注入(inject) DragAndDropService 以调用它的 alterMyProperty 方法并将 alteredProperty 的值传递给它。一旦调用此方法,它就会通知 DashboardComponent,因为它正在订阅alteredProperty$ Observable。

关于javascript - Angular 服务是否可以直接更改注入(inject)它的组件的属性(没有商店/RxJs)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53177788/

相关文章:

javascript - 使用忽略 html 标签的正则表达式搜索文本

带路由器的 Angular2 Material 设计 mdtabs

javascript - 如何在 Angular 2 和 4 中设置 WOW.js?

angular - RxJS 6+ 类型 'Observable' 必须有一个返回迭代器的 'Symbol.iterator' 方法

javascript - SwitchMap 在 Angular 中无法正常工作

javascript - 更改 CSS 以允许使用 Javascript 控制 DIV 位置

javascript - $rootScope.$apply() 不工作

javascript - 如何将 Electron 应用发布到应用商店?

angular - 无法绑定(bind)到 'routerLink',因为它不是已知属性

Typescript 构建从 node_modules 文件夹中获取错误