2017-10-15 8 views
0

なぜ結果が「コンポーネントの前の命令」であるのかわかりません。デコレータの実行順序とは何ですか?

function Component(component) { 
    console.log('selector: ' + component.selector); 
    console.log('template: ' + component.template); 
    console.log('component init'); 
    return (target: any) => { 
     console.log('component call'); 
     return target; 
    } 
} 

function Directive() { 
    console.log('directive init'); 
    return (target: any) => { 
     console.log('directive call'); 
     return target; 
    } 

} 

@Component({selector: 'person',template: 'person.html'}) 
@Directive() 
class Person {} 

let p = new Person(); 

出力:

selector: person 
template: person.html 
component init 
directive init 
directive call 
component call 

component calldirective call前にすべきではありませんか?

+2

は、なぜあなたはそれを思いますか?デコレータはその下のものに適用されるため、「内側に」適用されます。 – jonrsharpe

+0

どこからでも読むことができます。デコレータは左から右へ、上から下へ – Hao

+0

これは、マニュアルhttps://www.typescriptlang.org/docs/handbook/decorators.html#decorator-compositionで直接説明しています。 –

答えて

0

デコレータ表現上から下へと呼ばれ、デコレータを生産ます。
デコレータ自身のトップと反対方向に実行し、下:あなたの例では

@a @b x 
// bit like 
{ 
    const decA = a 
    const decB = b 
    decA(decB(x)) 
} 

{ 
    const decComp = Component({selector: 'person', template: 'person.html'}) 
    // selector: person 
    // template: person.html 
    // component init 
    const decDirective = Directive() 
    // directive init 
    decComp(decDirective(Person)) 
    // directive call 
    // component call 
} 

Reference

0

ディレクティブコールの前にコンポーネントコールをしてはいけませんか?

いいえ。内側はアウターより前に呼び出されます。基本的に

@C 
@D 
class Person {} 

はへ似何か次のようになります。

C(D(class Person())) 
関連する問題