Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 使用函数返回可观察和异步管道的模板绑定_Angular_Rxjs_Rxjs6_Rxjs Observables - Fatal编程技术网

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文件的所有字段,那么我需要从一个方法返回可观察的数据。你有没有你知道怎么做吗?