Angular 使用函数返回可观察和异步管道的模板绑定
注意这是一个简化的问题 模板:Angular 使用函数返回可观察和异步管道的模板绑定,angular,rxjs,rxjs6,rxjs-observables,Angular,Rxjs,Rxjs6,Rxjs Observables,注意这是一个简化的问题 模板: {{foo()$| async} 源代码: 从“@angular/core”导入{Component}; 从“rxjs”导入{BehaviorSubject,of,Observable}; 从“rxjs/operators”导入{tap、delay、map、switchMap、concatMap}; @组成部分({ 选择器:“我的应用程序”, templateUrl:“./app.component.html”, 样式URL:[“/app.component.c
{{foo()$| async}
源代码:
从“@angular/core”导入{Component};
从“rxjs”导入{BehaviorSubject,of,Observable};
从“rxjs/operators”导入{tap、delay、map、switchMap、concatMap};
@组成部分({
选择器:“我的应用程序”,
templateUrl:“./app.component.html”,
样式URL:[“/app.component.css”]
})
导出类AppComponent{
私有指数=0;
foo$():可观察
但是,如果我将.pipe(delay(1))
添加到foo$()
:
foo$():Observable从模板调用的方法在每个更改检测循环中都会被调用。因为您使用的是async
管道,所以每次发出都会触发更改检测。因此,基本上您创建的是一个无限循环,这就是为什么它永远不会显示值,因为更改检测永远不会完成:
查看初始化模板调用时foo$()
foo$()
创建一个新的可观察对象并延迟发射
可见光在延迟后发射
emit从async
管道内触发更改检测
更改检测从模板调用foo$()
,我们返回到步骤2
现在还不清楚您想要实现什么,但我认为您不应该从要在模板中使用的方法中返回可观测值
readonly foo$ = of("Delayed").pipe(delay(1));
但是,可以使用方法,但必须确保此方法返回相同的可观察的:
private readonly _foo$: Observable<any> = of("Delayed").pipe(delay(1));
foo$(): Observable<any> {
console.log('here');
return this._foo$;
}
我想我可以想出一种方法让它与方法调用一起工作,但在我深入研究之前,我首先想知道为什么您希望它首先是一个方法调用从模板调用的方法,在每个更改检测周期都被调用。因为您使用的是异步
管道,所以每次都会触发更改检测因此,基本上您正在创建一个无限循环,这就是为什么它永远不会显示值,因为更改检测永远不会完成:
查看初始化模板调用时foo$()
foo$()
创建一个新的可观察对象并延迟发射
可见光在延迟后发射
emit从async
管道内触发更改检测
更改检测从模板调用foo$()
,我们返回到步骤2
现在还不清楚您想要实现什么,但我认为您不应该从要在模板中使用的方法中返回可观测值
readonly foo$ = of("Delayed").pipe(delay(1));
但是,可以使用方法,但必须确保此方法返回相同的可观察的:
private readonly _foo$: Observable<any> = of("Delayed").pipe(delay(1));
foo$(): Observable<any> {
console.log('here');
return this._foo$;
}
我想我可以想出一种方法使它与方法调用一起工作,但在我深入研究之前,我首先想知道为什么您希望它首先是一个方法调用我真的没有明白您的意思。在我看来,它的工作如预期的那样。console.log
在函数调用之后立即执行,不管您做了什么在您返回的observable中的e(顺便说一句,我假设您在第二个示例中忘记了它,使用pipe(delay))
)的示例。我真的没有理解您的意思。在我看来,它的工作方式与预期的一样。console.log
在函数调用之后立即执行,不管您返回的observable中有什么(顺便说一句,我假设您在第二个示例中忘记了它,使用管道(延迟))
)@ArunMohan如果你愿意,你可以撤销它。使用OnPush
的建议仍然是正确的,应该鼓励。仅仅因为答案是“错误的”,并不意味着它可能对其他人没有帮助:D@PoulKruijt我实际上是从属性装饰器开始的,但我发现它无法访问主机信息,于是我转而使用该方法 decorator@GelinLuo你找到使用属性装饰器的方法了吗?@PoulKruijt是的,我用属性装饰器完成了。现在一切都好了。非常感谢!老实说,我认为typescript应该增强属性装饰器机制,以便它可以访问主机数据,例如访问hostHi@PoulKruijt的其他属性,以防我正在执行动态页面呈现,假设所有字段都来自一个可配置的JSON/YAML文件,那么我需要从一个方法中返回可观察的内容。你知道如何实现这一点吗?@ArunMohan如果你愿意,你可以取消它。使用OnPush
的建议仍然是正确的,应该受到鼓励。仅仅因为我得到了一个答案“错”并不意味着它可能对其他人没有帮助:D@PoulKruijt我实际上是从属性装饰器开始的,但我发现它无法访问主机信息,于是我转而使用该方法decorator@GelinLuo你有没有找到一种方法和一个房产装饰师一起做这件事?@PoulKruijt是的,我和房产装饰师一起做了。现在一切都好了。谢谢你说实话,我认为typescript应该增强属性装饰器机制,这样它就可以访问主机数据,例如,要访问hostHi@PoulKruijt的其他属性,如果我正在进行动态页面呈现,比如说来自可配置JSON/YAML文件的所有字段,那么我需要从一个方法返回可观察的数据。你有没有你知道怎么做吗?