各ビューモデルはbind()
メソッドで2つのパラメータ、bindingContext
とoverrideContext
を取得します。これは、ビュー・モデルアクセスメソッドやフィールドをすることができます Aurelia - カスタム要素は、デフォルトでバインディングコンテキストを継承しません。それは大丈夫ですか?
overrideContext: {
bindingContext: {...}, //current level
parentOverrideContext: {
bindingContext: {...}, //parent's binding context
parentOverrideContext: {...} //and so on
}
}
:等の親、親の親、これはそのようになります。最初のものは外側のスコープ(複数可)は、第2の、現在のスコープを説明します親のスコープからも同様です。
カスタム要素が作成されると、bindingContext
とoverrideContext
のパラメータがbind()
に受信されます。それはその子(REN)に渡したときにしかし、それは予想された形式ではありませんが、:元parentOverrideContext
は__parentOverrideContext
に移動されたことを
overrideContext: {
bindingContext: {...}, //current level, this is ok
parentOverrideContext: null,
__parentOverrideContext: {...}, //this is the real
}
は注意してください。この方法では、テンプレートエンジンは親のスコープから何も解決できません。
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
}
}
私が上で定義されたメソッドを呼び出すしたいのは、具体的な例を持ってみましょう最も内側のビューモデル(<custom-element-2>
)のボタンからの親の親(MyPage
)ですが、形式が異なるため、テンプレートgは親を見つけることができず、メソッドを解決できません。
一部のデバッグの後、私はフラグ(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 {}
私はそれを見ると、(上記の例で使用されていないが) 'bindable'sの概念を理解しています。私の実際のシナリオはやや複雑ですが、上記の例のように外側のスコープにアクセスする理由は、カスタム要素の任意の内部コンテンツを定義することです。カスタム要素にはイベントトリガーがいくつかある可能性があります。この内部コンテンツは内部要素のコンテキストに束縛されますが、コールバックを渡すのではなく、そこに定義されているため、(直接的に)外部スコープにイベントをバインドするのが自然です。 – balazska