【发布时间】: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