为什么总是可以使用Angular2构建单向数据流?

时间:2016-04-05 23:19:39

标签: angularjs typescript angular zone

我引用此article

在文章中提到angular2angular1更快的原因是因为angular2能够构建单向变更检测树。

我不明白的是,如果你有@outputeventEmitter数据流本质上是非单向的,因为数据可以流回其父级。

例如

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发送一个事件,该事件会将模型重新传递给的模型更改为CB。如果我们仅遍历C子树进行此更改检测,我们将错过AB

中的模型更改

文章错了吗?或者我错过了什么?

2 个答案:

答案 0 :(得分:0)

  

因为数据可以流回其父级

事实上。但是,信息将作为事件传递给父级,但数据从父级流向其子级。

基本上,孩子不会改变数据。只有父母(或任何拥有数据的人)才能做到。

答案 1 :(得分:0)

当值发生变化时,在下一个更改检测周期中,更改检测会识别它并更新从父项到子项的输入的绑定。

当输出发出事件时,父更新

并且事件启动新的更改检测周期。

这意味着变化检测本身只会将一个方向(单向)的变化从父变换到子变换 另一个方向的变化是通过其他方式(事件)传播的,如果变化检测本身会在两个方向上传播变化,那么这会破坏循环,这将使其变得困难。

另见http://pascalprecht.github.io/slides/angular-2-change-detection-explained