【问题标题】:How to get notified about service changes to component?如何获得有关组件服务更改的通知?
【发布时间】:2019-07-10 17:07:12
【问题描述】:

是否可以永久监听服务中的所有更改并将此信息传输到组件?

我知道我可以在如下服务中创建 Observable:

@Injectable()
export class LoadingService {
    myBool$: Observable<boolean>;

    private boolSubject: BehaviorSubject<boolean>;

    constructor() {
        this.boolSubject = new BehaviorSubject(true);
        this.myBool$ = this.boolSubject.asObservable();
    }

    set myBool(newValue) {
        console.log("set",newValue)
        this.boolSubject.next(newValue);
    }
}

我也知道我可以有一个组件或指令(如下所示)来订阅 observable 以获得有关更改的通知。

@Directive({
    selector: '[loading]'
})
export class LoadingDirective implements AfterViewInit {

    constructor(
    private element: ElementRef, 
    private renderer: Renderer2, 
    private loadingService: LoadingService
) {

    this.loadingService.myBool$.subscribe(response => {
        console.log("-----",response)               
    })
}

但我只得到subscribe 中服务变量的第一次更改。我怎样才能获得所有未来的变化(如事件监听器)?

感谢您的帮助!

【问题讨论】:

  • 这应该有效,并且总是当通过服务设置新值时,应该调用订阅者。你确定你不会在某个时候退订吗?
  • 您的代码应该可以工作。如果不是,请创建一个stackblitz example 来重现您的问题。
  • 真正的问题是:如何在可观察值发生变化时始终触发函数?我知道当我在 HTML 代码中使用它时它可以工作,但是我的场景中没有任何 HTML 并且想要调用一个函数....有什么想法吗?

标签: angular rxjs components observable


【解决方案1】:

发生了一些小事。首先,在您的服务中,您应该将 observable 序列声明为 get 函数,这样所有对它的新请求都会返回一个新的 observable。它的写法是对BehaviorSubject的滥用。

get myBool$: Observable<boolean> {
  return this.boolSubject.AsObservable();
}

接下来,你应该看看模板中的Async Pipe。 Todd Motto 写了一个 pretty decent article ,关于使用 observables 直接从模板订阅值的变化。

这可能如下所示(应注意,此处的常规 Subject 更可取,因为 BehaviorSubject总是在订阅后立即返回一个值):

<div *ngIf="myBool$ | async as value; else loading">
  <!-- use the value here? -->
  <span> {{ value }} </span>
</div>
<div #loading>
  ... loading spinner here ...
</div>

【讨论】:

  • 您好 theMayer,感谢您的回答和支持。但我的问题是我没有任何 HTML 输出。当 observable 被更改时,我需要在我的组件(指令)中调用一个函数。我怎样才能做到这一点?
  • 好吧,我做到了,但找不到解决方案。在这里写作和询问总是我最后一次尝试......
猜你喜欢
  • 2015-12-10
  • 2021-05-03
  • 2012-06-21
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多