代码之家  ›  专栏  ›  技术社区  ›  Purrell

如何在Angular 5中使用CombineTest和takeUntil rxjs操作符

  •  0
  • Purrell  · 技术社区  · 7 年前

    我看到在Angular 5中,应该以不同的方式使用rxjs操作符,并从 'rxjs/operators' 但我有点不清楚它应该如何工作。我有这样的想法:

    import { Observable } from 'rxjs/Observable';
    
    import { combineLatest, takeUntil } from 'rxjs/operators';
    
    @Component({ ... })
    export class FooComponent implements OnInit, OnDestroy {
    
    
      constructor(private route: ActivatedRoute) {}
    
    
      ngOnInit() {
    
        this.route_data = Observable.combineLatest(this.route.params, this.route.data,
                                 (params, data) => ({params,data}));
    
        this.route_data_sub = this.route_data.takeUntil(this.destroyed$).subscribe(
          (params_and_data) => {
                                ...
                               }
       }
     ...
    }
    

    但我正在 Observable.combineLatest is not a function 错误。如果我添加combineLatest操作符,它对combineLatest的工作方式是旧的,但是 takeUntil 现在找不到。角度5应该怎么做?

    我在应用程序中有很多rxjs代码,不知道应该如何重写,也不知道如何更改导入。是否所有内容都必须重写。管道()现在?

    2 回复  |  直到 7 年前
        1
  •  4
  •   Michael Pautov    7 年前

    您应该导入 combileLatest 使用

    import { combineLatest } from 'rxjs/observable/combineLatest';

    对于 takeUntil

    import { takeUntil } 'rxjs/operators';

    我发现以下信息:

    combineLatest
    takeUntil

        2
  •  2
  •   Purrell    7 年前

    @《疯狂的蒲公英》有一个正确的答案,但我认为值得向任何一个遇到同样东西的人展示一下它是什么样子的。你确实需要像takeUntil这样的管道。浏览一个大型应用程序并找到所有这些点有点痛苦,但不会花那么长时间。看起来也没那么糟,而且有所有的好处 https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md 在“为什么”下。

    import { Observable } from 'rxjs/Observable';
    import { combineLatest } from 'rxjs/observable/combineLatest';
    import { takeUntil } from 'rxjs/operators';
    
    
    @Component({ ... })
    export class FooComponent implements OnInit, OnDestroy {
    
    
      constructor(private route: ActivatedRoute) {}
    
    
      ngOnInit() {
    
        this.route_data = combineLatest(this.route.params,
                                        this.route.data,
                                        (params, data) => ({params,data})
                                       );
    
        this.route_data_sub = this.route_data
                               .pipe(takeUntil(this.destroyed$)) //<-- pipe()
                               .subscribe((params_and_data) => {
                                ...
                               })
       }
     ...
    }
    

    同样在我的例子中,我有一些过时的DLL服务于旧的RXJ( https://webpack.js.org/plugins/dll-plugin/ )因此,如果您遇到一些看起来您的可观察对象没有管道属性的东西,那么如果您使用管道属性,您可能需要确保DLL正确构建。