Angularjs 为什么总是可以使用Angular2构建单向数据流?
我指的是这个 文章中提到,之所以Angularjs 为什么总是可以使用Angular2构建单向数据流?,angularjs,typescript,angular,zone,Angularjs,Typescript,Angular,Zone,我指的是这个 文章中提到,之所以angular2比angular1快,是因为angular2具有构造单向变化检测树的能力 我不明白的是,如果您有@output和eventEmitter数据流本质上是非单向的,因为数据可以流回到其父级 比如说 Child @Component({ selector: 'Child', inputs: ['myfullname'], outputs: ['changefirstname'] }) @View({ template: ` <
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');
}
}
上面我们有一个非常简单的设置
每当单击子项时,父项中的名称都会更新,但由于子项从父项接收名称,因此子项也会更新。我们可以看到,这不是单向数据流,因为它不是自上而下的
我们还可以构造一个更极端的例子
A
/ \
B C
其中,C
可以向A
发出一个事件,该事件将模型重新传递给C
和B
。如果我们仅遍历此更改检测的C
子树,我们将错过A
和B
中的模型更改
这篇文章错了吗?还是我遗漏了什么
因为数据可以流回到其父级
的确如此。但信息作为一个事件流向父级,而数据则从父级向下流向子级
基本上,子对象不会对数据进行变异。只有父级(或拥有数据的任何人)才这样做
因为数据可以流回到其父级
的确如此。但信息作为一个事件流向父级,而数据则从父级向下流向子级
基本上,子对象不会对数据进行变异。只有父对象(或拥有数据的任何对象)会这样做。当值发生更改时,在下一个更改检测周期中,更改检测将识别该值并更新从父对象到子对象的输入绑定 当输出发出事件时,将更新父级 该事件启动一个新的变化检测周期 这意味着更改检测本身仅在一个方向(单向)将更改从父级传播到子级。
另一个方向上的更改通过其他方式(事件)传播,这打破了一个循环,如果更改检测本身将在两个方向上传播更改,那么这个循环将变得很困难
另请参见当值更改时,在下一个更改检测周期中,更改检测将识别该值并更新从父级到子级的输入绑定 当输出发出事件时,将更新父级 该事件启动一个新的变化检测周期 这意味着更改检测本身仅在一个方向(单向)将更改从父级传播到子级。
另一个方向上的更改通过其他方式(事件)传播,这打破了一个循环,如果更改检测本身将在两个方向上传播更改,那么这个循环将变得很困难
另请参见在变化检测中,angular2似乎也是一个
O(n)
trasversal,为什么幻灯片中的作者声称angular2比angular1快。如果你像使用.push
那样优化angular2是否会更快?我不太了解Angular1,但是如果Angular1有双向数据绑定,可能会导致循环,它可能需要在树的相同部分迭代几次,直到模型稳定,从而使其>O(n)。但是你也可以在angular2中构造一个循环。这只是因为周期由数据更改和事件组成,而不仅仅是数据更改,但无论哪种方式,都需要启动更改检测来捕获这一点。在devMode中,如果更改检测导致数据更改,则角度抛出。这可以很好地防止循环。看来angular2在变化检测中也是一个O(n)
trasversal,为什么幻灯片中的作者声称angular2比angular1快。如果你像使用.push
那样优化angular2是否会更快?我不太了解Angular1,但是如果Angular1有双向数据绑定,可能会导致循环,它可能需要在树的相同部分迭代几次,直到模型稳定,从而使其>O(n)。但是你也可以在angular2中构造一个循环。这只是因为周期由数据更改和事件组成,而不仅仅是数据更改,但无论哪种方式,都需要启动更改检测来捕获这一点。在devMode中,如果更改检测导致数据更改,则角度抛出。这可以很好地防止循环。
A
/ \
B C