1

我正在参考这篇文章

文章中提到之所以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改变模型重新传递给模型的模型CB。如果我们只为这种变化检测遍历C子树,我们将错过模型变化AB

文章错了吗?还是我错过了什么?

4

2 回答 2

0

因为数据可以流回其父级

的确。但是信息作为事件流向父级,但数据从父级向下流向其子级。

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

于 2016-04-05T23:21:29.290 回答
0

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

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

并且该事件启动一个新的变更检测周期。

这意味着更改检测本身仅将一个方向(单向)的更改从父级传播到子级。
另一个方向的变化通过其他方式(事件)传播,这打破了循环,如果变化检测本身会在两个方向上传播变化,这将变得困难。

另请参阅http://pascalprecht.github.io/slides/angular-2-change-detection-explained

于 2016-04-06T04:45:48.710 回答