gpt4 book ai didi

Angular 内插值未在订阅时更新

转载 作者:行者123 更新时间:2023-12-02 17:06:16 25 4
gpt4 key购买 nike

  • Angular 6.0.1
  • ngRx 6.0.1

我在 View 中设置了一个插值:

{{firstName}}

当它绑定(bind)到的字段的值发生变化时,它不会更新。虽然值正在发生变化 - 如果我将其注销到订阅内的控制台,我会看到更新后的值。它只是不在 UI 中更新。

相关代码如下:

从我的组件订阅:

private subscribeToCurrentPerson(): void {
this.tState$ = this.store
.pipe(select(selectors.getCurrentPerson), takeWhile(() => this.componentActive))
.subscribe((cp: Person) => {
if (cp) {
const name: string = cp.primaryName.value.parsedValue.givenNames[0];
this.firstName = name;
console.log('name: ' + name); // <-- this shows correct new value
}
});
}

subscribeToCurrentPerson 从组件的 ngOnInit 调用。在此之前,firstName 属性是未定义的。

selectors.getCurrentPerson 选择器如下所示:

export const getCurrentPerson: MemoizedSelector<{}, Person> = 
createSelector(getTState, (tState: ITState) => {
console.log('selector: ', tState); // <-- this logs the correct new value
return tState ? tState.currentPerson : null;
});

从选择器返回的 currentPerson 值是一个新创建的对象。这是在应用程序首次运行时发生的,因此在此之前 tState 是未定义的。

如果我在我的构造函数中注入(inject) ChangeDetectorRef 并在订阅内调用 cdr.detectChanges(),UI 会更新。但在我看来,我通常不需要像这样使用 ChangeDetectorRef,它应该“正常工作”。

我认为问题出在我的深层嵌套属性 (cp.primaryName.value.parsedValue.givenNames)。我从一个非 ngRx 项目继承了这些实体,但我认为我的下一步是尝试扁平化该结构,看看这是否会让 ngRx 和 Angular 变化检测器更快乐。

还有什么我想念的吗?

更新

我通过简单地更新订阅内我的组件上的本地属性,将深层嵌套的属性从图片中移除。所以 subscribeToCurrentPerson 函数现在看起来像这样:

private subscribeToCurrentPerson(): void {
this.tState$ = this.store
.pipe(select(selectors.getCurrentPerson), takeWhile(() => this.componentActive))
.subscribe((cp: Person) => {
this.myProp = 'goodbye';
this['newProp'] = 'world';
});
}

myProp 是我为测试添加的组件上的现有属性。newProp 在通过订阅内的括号符号添加之前不存在。这是结果:

  • myProp 未更新 - 它显示我在声明时分配给它的值。但是,如果我在声明属性时未分配值,则订阅中分配的值会正确显示在 UI 中。
  • newProp 正确显示在 UI 中

我现在完全不知所措。 似乎一旦一个属性有了一个值,它就永远不会在 UI 中更新,即使值本身确实发生了变化(我可以在更新值后通过登录控制台来判断)。

我没有为组件显式设置 ChangeDetectionStrategy,所以它是 Default

如果我调用 detectChanges 一切正常,但我认为这不是必需的。

最佳答案

当父组件将其更改检测策略设置为 OnPush 时那么这个父组件树将不会被 Angular 的变化检测机制检查,尽管这个父组件及其子组件的 ngOnChanges每次仍然调用方法 @Input属性改变。要让 Angular 知道这棵树中的某些组件需要更新,请注入(inject) ChangeDetectorRef。进入该组件并使用其 API 通知 Angular 有关更新,例如 detectChangesmarkForCheck

关于 Angular 内插值未在订阅时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51690866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com