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