2016-09-07 4 views
2

各ビューモデルはbind()メソッドで2つのパラメータ、bindingContextoverrideContextを取得します。これは、ビュー・モデルアクセスメソッドやフィールドをすることができます Aurelia - カスタム要素は、デフォルトでバインディングコンテキストを継承しません。それは大丈夫ですか?

overrideContext: { 
    bindingContext: {...}, //current level 
    parentOverrideContext: { 
     bindingContext: {...}, //parent's binding context 
     parentOverrideContext: {...} //and so on 
    } 
} 

:等の親、親の親、これはそのようになります。最初のものは外側のスコープ(複数可)は、第2の、現在のスコープを説明します親のスコープからも同様です。

カスタム要素が作成されると、bindingContextoverrideContextのパラメータが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 {} 

答えて

2

これは意図的なものです。これは、外部スコープの特定のプロパティに依存しているため、開発者がポータブルではないカスタム要素を作成するのを防ぎます。

https://www.danyow.net/aurelia-custom-element-vs-compose/

+0

私はそれを見ると、(上記の例で使用されていないが) 'bindable'sの概念を理解しています。私の実際のシナリオはやや複雑ですが、上記の例のように外側のスコープにアクセスする理由は、カスタム要素の任意の内部コンテンツを定義することです。カスタム要素にはイベントトリガーがいくつかある可能性があります。この内部コンテンツは内部要素のコンテキストに束縛されますが、コールバックを渡すのではなく、そこに定義されているため、(直接的に)外部スコープにイベントをバインドするのが自然です。 – balazska

関連する問題