各ビューモデルは、そのbind()
メソッドでbindingContext
との 2 つのパラメーターを取得しますoverrideContext
。最初のものは現在のスコープを記述し、2 つ目は外側のスコープ (親、親の親など) を記述します。これは次のようになります。
overrideContext: {
bindingContext: {...}, //current level
parentOverrideContext: {
bindingContext: {...}, //parent's binding context
parentOverrideContext: {...} //and so on
}
}
これにより、ビューモデルは親のスコープからもメソッドとフィールドにアクセスできます。
bindingContext
カスタム要素が作成された場合、期待されるおよびoverrideContext
パラメータをで受け取りますbind()
。しかし、それらを子に渡すと、期待される形式ではありませんが、次のようになります。
overrideContext: {
bindingContext: {...}, //current level, this is ok
parentOverrideContext: null,
__parentOverrideContext: {...}, //this is the real
}
parentOverrideContext
オリジナルは に移動されていることに注意してください__parentOverrideContext
。このように、テンプレート エンジンは親のスコープから何も解決できません。具体例を見てみましょう:
page.html:
<template>
Hello, user!
<custom-element-1>
<custom-element-2>
<button click.trigger="myHandler()">Call myHandler</button>
</custom-element-2>
</custom-element-1>
</template>
page.js:
export class MyPage {
myHandler() {
//do something here
}
}
MyPage
ここで、親の親 ( ) で定義されたメソッドを最も内側のビューモデル ( ) のボタンから呼び出したいの<custom-element-2>
ですが、フォーマットが異なるため、テンプレートは親を見つけることができず、メソッドを解決できません。
instruction.inheritBindingContext
いくつかのデバッグの後、親を含めるかどうかを決定するフラグ ( ) があることに気付きました。このフラグはtrue
、デフォルトではルータービュー用ですがfalse
、カスタム要素用です。質問: 私はそれを正しく理解していませんか? これは望ましい動作ですか? それともバグですか?
とにかく、誰かが興味を持っているなら、フラグは簡単に変更できます:
import {customElement, processContent} from 'aurelia-templating';
@processContent((compiler, resources, node, instruction) => {
instruction.inheritBindingContext = true;
return true/false;
})
@customElement('custom-element-1')
export class CustomElement1 {}