私はこのarticleを参照しています。Angular2を使用して単方向データフローを構築することが常に可能なのはなぜですか?
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;
}
}
子がクリックされるたびに、かなりシンプルなセットアップ
を持っている、名前は親に更新されます、子供が名前を受け取るので親からの子も更新されます。トップダウンではないので、これは単方向データフローではないことがわかります。
我々はまたC
モデルがダウンC
とB
両方にパスを再されたモデルを変更A
にイベントを発することができる、より極端な例
A
/ \
B C
を構築することができます。この変更検出でC
サブツリーのみをトラバースすると、A
とB
の両方のモデル変更が見逃されます
この記事は間違っていますか?または私は何かを逃していますか?
それはangular2また、変化検出における 'O(n)の' trasversalあるようだ、なぜスライド主張angular2で著者はangular1よりも高速です。 '.push'を使うようにangular2を最適化するほうが速いのですか? – Kevin
Angular1はよく分かりませんが、Angular1にモデルが安定するまでツリーの同じ部分を何回か繰り返しなければならないサイクルにつながる双方向データ結合があると、> O(n )。 –
しかし、Angular2でサイクルを構成することもできます。そのサイクルは単にデータ変更ではなくデータ変更とイベントで構成されていますが、どちらの方法でも変更検出を実行する必要があります。 – Kevin