在Angular 5中,我想使用first()方法,如下所示:
this.ccService.mode.first().subscribe(mode => {
this.mode = mode;
});
我是这样导入的:import { first } from 'rxjs/operators/first';
。
我还尝试从'rxjs/add/operator'
,'rxjs/operators'
,'rxjs'
导入,但似乎都无法正常工作。
但是,它拒绝工作,只给出了您在标题中看到的错误消息:[ts] Property 'first' does not exist on type 'Observable<string>'.
。
mode
可观察:
private modeSource = new BehaviorSubject<string>('new');
public mode = this.modeSource.asObservable();
public setMode(mode: string) {
this.modeSource.next(mode);
}
我一直在谷歌搜索,但我似乎找不到任何有同样错误的人,我只是没有使用first()
对吗?我应该使用.pipe(first()).subscribe
吗? https://www.learnrxjs.io/operators/filtering/first.html间歇性地使用observable.first().subscribe
和observable.pipe(first()).subscribe
而没有明确的解释或推理,所以我在这里有点迷失。
答案 0 :(得分:5)
TL; DR;是的,你应该使用可管理的操作符。
自rxjs v5.5以来的变更:
链接运算符的先前编码风格已被替换 将一个操作员的结果输送到另一个操作员可管理的操作员 在5.5版中添加。有关推理和完整的讨论 可管道运算符所需的更改,请参阅RxJS文档。
这是why:
用于点链的修补运算符的问题是:
任何导入补丁运算符的库都会增加 该库的所有消费者的Observable.prototype,造成盲目 依赖。如果库删除了他们的用法,他们会在不知不觉中 打破其他人。使用pipeables,您必须导入运算符 你需要在你使用它们的每个文件中。
直接打印到原型上的操作员不是“树木可摇动的” 通过rollup或webpack等工具。可管理的操作员将像他们一样 只是直接从模块中提取的函数。
无法检测到在应用中导入的未使用的运算符 可靠地通过任何类型的构建工具或棉绒规则。这意味着 您可以导入扫描,但停止使用它,它仍然被添加 到您的输出包。如果您不使用,可以使用可管理的操作员 它,一个棉绒规则可以为你挑选。
功能性成分非常棒。构建自己的自定义运算符 变得更容易,现在他们的工作和看起来就像所有人一样 来自rxjs的其他运营商。您不需要扩展Observable或 再次超越升力。