Angular子组件无法识别输入属性的更改。

19 浏览
0 Comments

Angular子组件无法识别输入属性的更改。

我有一个父组件,其中包含一个名为documents的属性。该属性是一个数组,用于将数组中的文件传递给子组件。

但是,当我将一个新的文件推送到我的documents属性中时,子组件的视图不会改变。有人可以告诉我在这里做错了什么吗?

这是父组件中documents属性发生变化的地方:

// 处理从对话框返回的数据

createDialog.afterClosed().subscribe(

data => {

if (data){

// 持久化文档

this.documentService.saveDocument(data.newDocument); // 尚未实现,因为后端不起作用

this.documents.push(data.newDocument);

// 更新所属文档的现有文档存储桶

this.loincToDocumentsMap.get(data.loincCode)?.folderContent.push(data.newDocument);

}

}

);

这是我的子组件:

@Component({

selector: 'document-list',

templateUrl: './document-list.component.html',

styleUrls: ['./document-list.component.scss'],

changeDetection: ChangeDetectionStrategy.OnPush

})

export class DocumentListComponent implements OnInit, OnChanges {

@Input() documents: DocumentReference[] = [];

....

}

这是我在父组件中使用子组件的地方:

我真的很感激一些帮助,因为其他组件也可以正常工作,我找不到任何区别。例如,同一个父组件中的另一个子组件会被正确更新。

更新1:

在添加了这个之后,变化检测起作用了。但是为什么呢?

this.documents = this.documents.filter(document => {

return true;

})

更新2:

谢谢大家,解决方案在答案中:)

0
0 Comments

问题的原因是使用了OnPush变化检测。OnPush变化检测只有在数组的指针发生变化时才会触发变化检测(因此进行渲染),但不会检查数组的内容。因此,如果向数组中添加一个项,它不会改变数组的指针。

解决这个问题有几种方法:

- 移除OnPush

- 创建一个新的数组

- 对数组使用可观察对象

我只是从另一个帖子中添加了OnPush,因为我以为这可以解决我的问题。但实际上没有。但是创建一个新的数组会有帮助,正如你所说的。谢谢!

0
0 Comments

问题的原因是Angular的变化检测机制只会检查对象的身份标识,而不会检查对象的内容。因此,对于输入属性的插入或删除操作不会被检测到。

解决方法是重新分配对象来触发变化检测。具体来说,如果想要触发变化检测,需要重新给输入属性赋值。

参考资料:

- https://stackoverflow.com/a/43223700/5835354

- https://stackoverflow.com/a/42962723/5835354

0