angular - Angular 6:OnChanges 不适用于异步管道
问题描述
我有一个组件需要跟踪数据源的更改。父组件通过异步管道提供数据。如果数据源更改(添加或删除项目),则不会触发 ngOnChanges。
帮助处理问题。
@Component({
selector: 'app-todo',
template: `
<div>
<button (click)="addTodo()">Add Item</button><br />
<div *ngFor="let todo of todos">
{{ todo.value }} <button (click)="deleteTodo(todo.id)">x</button>
</div>
</div>
`
})
export class TodoComponent implements OnChanges {
@Input() todos: Todo[];
constructor(private todoService: TodoService) {
}
addTodo() {
this.todoService.create({ value: 'value '+this.todos.length });
}
ngOnChanges(changes: { [key: string]: SimpleChange })
{
if (changes['todos']) {
console.log('todos changed')
}
}
deleteTodo(todoId: number) {
this.todoService.remove(todoId);
}
}
父组件:
@Component({
selector: 'my-app',
template: `
<h1>Angular Observable Data Services</h1>
<p>Only implimented a simple post and delete</p>
<h3>Component 1</h3>
<app-todo [todos]='todos | async'></app-todo>
<br /><br />
<h3>Component 2</h3>
<app-todo [todos]='todos | async'></app-todo>
`
})
export class AppComponent {
todos: Observable<Todo[]>;
constructor(private todoService: TodoService){
this.todos = this.todoService.todos;
this.todoService.loadAll();
}
}
解决方案
您遇到了浅/深克隆问题。
例如,在您的服务create
方法中,您复制this.dataStore
但随后重用其todos
未复制的属性,它保持相同的引用,因此没有什么可以触发onChange
。
你想要做的是这样的:
this.dataStore.todos.push(something); //this mutates an array
const x = [...this.dataStore.todos];`//clones actual array
并将其输入您的BehaviorSubject.next(x)
推荐阅读
- mysql - 在 AWS EC2 实例上配置 wiki.js(开源)
- vba - Word VBA SelectContentControlsByTag 集合乱序?
- or-tools - 你能重现 VRP 的结果吗?
- python - 按日期重新采样并分类具有日期时间开始和日期时间结束的 DataFrame
- python - 改进 scipy 最小化元素依赖性
- netlogo - 记者乌龟/乌龟x的不同结果
- reactjs - 如何使用 React 数字输入进行 onChange
- python - 我想创建一个帐户生成器,但它给了我一个 404 on request URL
- php - 搜索以“反向”顺序返回没有结果
- css - 为什么过滤器不适用于身体?