【问题标题】:Angular/TypeScript: Write code in SubscriptionAngular/TypeScript:在订阅中编写代码
【发布时间】:2018-05-13 04:41:28
【问题描述】:

我正在使用 Angular (4),需要帮助来处理异步数据:

您可以在下面看到方法connect()。第一个命令订阅了我的服务的 Observable。以下行也需要在此订阅中。但我不知道怎么做。该方法应将 getSortedData() 方法的结果作为 Observable 返回。

我的项目组件

   //...
    items: Item[];
    //...
    connect(): Observable<Item[]> {
            this.myItemService.getItem().subscribe(response => {
                this.items = response;
            });
            const displayDataChanges = [
                this.myItemService.getItem(),
                this.sort.sortChange,
            ];
            return Observable.merge(...displayDataChanges).map(() => {
                return this.getSortedData(this.items);
            });
        }
    //..

【问题讨论】:

    标签: angular typescript


    【解决方案1】:

    不要读取操作符内部的可变状态。当它们发生变化时,observable 将不知道也不会再次运行您的代码。

    所以我删除了this.items 的使用,并将sort 参数传递给getSortedData()

    connect(): Observable<Item[]> {
      const displayDataChanges = [
        this.myItemService.getItem(),
        this.sort.sortChange,
      ];
      return Observable.combineLatest(...displayDataChanges).map(([items, sort]) => {
        return this.getSortedData(items, sort);
      });
    }

    我调用 combineLatest() 而不是 merge(),它将在每次任何可观察值发生变化时运行以下运算符,并使用每个运算符的最新值。

    【讨论】:

    • 非常感谢,但我不再收到我的数据了。 'typeof Observable' 类型上也不存在 combineDate。你有什么想法吗?
    • 我的排序是'@ViewChild(MatSort) 排序:MatSort;'所以我想直接在我的 getSortedData 方法中使用 this.sort。这可能吗?
    • 哪个 combineDate?!
    • 对不起,我的意思是 combineLatest。
    • 在项目中导入一次'rxjs/Observable/add/combineLatest'
    猜你喜欢
    • 2020-06-16
    • 2020-11-25
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2023-02-09
    • 1970-01-01
    • 2020-12-10
    相关资源
    最近更新 更多