我引用此article。
在文章中提到angular2
比angular1
更快的原因是因为angular2
能够构建单向变更检测树。
我不明白的是,如果你有@output
和eventEmitter
数据流本质上是非单向的,因为数据可以流回其父级。
例如
Child
@Component({
selector: 'Child',
inputs: ['myfullname'],
outputs: ['changefirstname']
})
@View({
template: `
<div (click)="changefirstname()">
{{myfullname}}
</div>
`
})
export class Child {
public myfullname: String;
public myevent: EventEmitter = new EventEmitter();
changefirstname(evt) {
this.myevent.next('newfirstname');
}
}
Parent
@Component({
selector: 'Parent',
directives: [Child]
})
@View({
template: `
<Child [myfullname]={{myfullname}} (myevent)="handleMyEvent($event)"></Child>
`
})
export class Parent {
this.myfullname = 'default';
handleMyEvent(arg) {
this.myfullname = arg;
}
}
上面我们有一个非常简单的设置
每当点击子项时,名称会在父项中更新,但由于子项从父项接收名称,因此子项也会更新。我们可以看到这不是单向数据流,因为它不是自上而下的。
我们还可以构建一个更极端的例子
A
/ \
B C
C
可以向A
发送一个事件,该事件会将模型重新传递给的模型更改为C
和B
。如果我们仅遍历C
子树进行此更改检测,我们将错过A
和B
文章错了吗?或者我错过了什么?
答案 0 :(得分:0)
因为数据可以流回其父级
事实上。但是,信息将作为事件传递给父级,但数据从父级流向其子级。
基本上,孩子不会改变数据。只有父母(或任何拥有数据的人)才能做到。
答案 1 :(得分:0)
当值发生变化时,在下一个更改检测周期中,更改检测会识别它并更新从父项到子项的输入的绑定。
当输出发出事件时,父更新
并且事件启动新的更改检测周期。
这意味着变化检测本身只会将一个方向(单向)的变化从父变换到子变换 另一个方向的变化是通过其他方式(事件)传播的,如果变化检测本身会在两个方向上传播变化,那么这会破坏循环,这将使其变得困难。
另见http://pascalprecht.github.io/slides/angular-2-change-detection-explained