【问题标题】:Passed function as parameter isn't called on subscribe订阅时不调用作为参数传递的函数
【发布时间】:2021-05-20 09:27:37
【问题描述】:

我正在生成一个传递函数的节点:

this.navigatinoService.generateNode(null, null... , this.navigationService.displayApkStoreMenu,..)

generate 函数看起来像这样。

public generateNode(translationId: string, iconId: string, display: any, disabled, routerLink: string, children: SideNavNode[]): SideNavNode {
    const node: SideNavNode = {
      translationId: translationId,
      iconId: iconId,
      display: this.userService.getUser().subscribe(() => node.display = display()),
      disabled: disabled,
      routerLink: routerLink,
      children: children
    };

    this.SIDENAV_TREE_DATA.push(node);
    return node;
  }

我不想订阅userService.getUser(),它会在用户更改时触发。当用户发生变化时,我想再次触发显示函数以返回 true 或 false。

这里是函数displayApkStoreMenu的一个例子:

displayApkStoreMenu(): boolean {
    // some code...
    return // either true or false
  }

现在,当用户更改该函数时,根本不会调用该函数,并且 display 的值也不会更改。但我知道订阅正在触发,因为当我输入console.log 而不是node.display = display() 时,它将触发console.log

【问题讨论】:

  • 用户更改时控制台有错误吗?
  • 不,我没有收到任何错误。我将 console.log 放在 displayApk... 函数中,所以我知道它什么时候触发,但控制台中什么也没有。
  • 那么你确定在getUser() 方法上你总是返回相同的可观察对象吗?你能告诉我们那个方法的代码吗?
  • 如果我把 console.log 而不是 node.display = display() 它将记录到控制台中,所以我知道订阅正在正确触发。我不需要 getUser 返回的值,我只需要它来触发我的函数,我知道 getUser 被正确触发了。
  • 您可以尝试将代码行this.userService.getUser().subscribe(() => node.display = display()) 移动到对象node 实例化之后吗?我的意思是,您正在尝试将 displayApkStoreMenu 方法的结果应用于节点显示属性,但您得到的是订阅。当然,您稍后会在用户更改时覆盖它,但是如果同步调用该方法怎么办?这可能取决于getUser 方法的内容。如果它不起作用,我们需要一个MVCE

标签: angular function object subscription


【解决方案1】:

我以不同的方式解决了我的问题。我什至不需要在订阅时执行函数,我只是传递了这样的值:

function : () => this.myFunction()

当函数的返回值改变时,值也会改变。 所以我猜这就像订阅函数的值一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-06
    • 2020-03-25
    • 2017-10-07
    • 2013-12-11
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多