web-dev-qa-db-ja.com

ui5のBinding、Context、ContextBinding、BindingContext

私はここ数日間、コンテキスト、コンテキストバインディング、バインディングコンテキストの内部と関係を熟考してきましたが、私の側に大きな誤解があるかどうかはわかりません。多分あなたの何人かはそれを整理するのを助けることができます。以下に私の仮定を置きます。ここでは常にoDataモデルを使用することを最初に述べておきたいと思います。

これは、ドキュメントを読んで理解すると私が信じていることです:

contextは、モデル内のデータオブジェクトへの参照です。

bindingは、基本的にはイベントプロバイダーであり、(一方向バインディングの場合)特定のコンテキストのステータスを監視し、変更またはデータのロード時にイベントを発行します。したがって、イベントの登録が可能です。特定のコンテキストのイベントのハンドラー。オブジェクトのプログラミングに関しては、プロパティバインディングとリストバインディングがあります(これは本当ですか、それともリストバインディングが関連するすべてのものですか?)。

とにかく、私の理解では、リストバインディングはコンポーネントの集約バインディングのモデル側であり、プロパティバインディングはコンポーネントとモデルの両方の観点からプロパティバインディングと呼ばれます(混乱しますか?)。

ここで私がまったく得られないのは、コンテキストバインディングnew sap.ui.model.ContextBinding(oModel, sPath, oContext, mParameters?, oEvents?):がパスとcontextをパラメーターとして取ることです。このoContextは、上記のコンテキストではなく、バインディングのメタデータであると想定しています。これは正しいです?または、これはパスパラメータが相対的であるパスの定義ですか?

また、コンテキスト自体を作成したい場合にも奇妙に思えますnew sap.ui.model.Contextabov(oModel, sPath, oContext)は、コンテキストを再度取得します。これは私が見ている残念なネーミングの問題だと思いますが、私にはよくわかりません。

次に、contextbindingとbindingcontextがあります。 eで説明されているように、contextBindingは特定のコンテキストへのバインディングであると思います。そしてbindingcontextは、コンテキストまたはリストのバインディングに関するメタデータです。

プログラミングの観点からは、以下が機能する理由がわかりません。

  • パスのみを渡すmodel.bindList()を介してコンテキストにバインドするリストを作成します。
  • バインディングに変更イベントハンドラーをアタッチする
  • バインド時にget_contexts()を呼び出す
  • 変更イベントハンドラーでデータを受信します(モデルに入力されたoDataプロパティを参照してください)。

model.bindProperty()を使用して生成できると想定しているプロパティバインディングに対して同じことを行う方法はないようです。バインディングを生成できますが、受け取ったバインディングには、実際にデータをフェッチするためのハンドルがないようです。

騒動が私の問題を説明してくれることを願っています。あなたが尋ねた場合:あなたは何をしたいですか?私は実際には何もしたくないのですが、これがどのように機能するのかよくわかりません。 UIコントロールなどへのバインドは問題なく動作しますが、内部の内容を本当に理解したいと思います。私はデバッグファイルと単体テストを少し読んでいますが、皆さんとそれを話し合うことも素晴らしい方法のようです。

これが不明確な場合は、役立つものを喜んで追加します。

乾杯ミシェル

17
michel luther

あなたの質問は以下で答えられます。それが役に立てば幸い。

  1. ここで私がまったく得られないのは、コンテキストバインディングnew sap.ui.model.ContextBinding(oModel, sPath, oContext, mParameters?, oEvents?):がパスとコンテキストをパラメーターとして取ることです。このoContextは、まさに上記のコンテキストではなく、バインディングのメタデータであると想定しています。これは正しいです?または、これはパスパラメータが相対的であるパスの定義ですか?

    oContextは、上記のコンテキストです。正確には、_sap.ui.model.Context_です。

  2. また、奇妙に見えるのは、コンテキスト自体を作成する場合ですnew sap.ui.model.Context(oModel, sPath, oContext)は、コンテキストを再度取得します。これは私が見ている残念なネーミングの問題だと思いますが、私にはよくわかりません。

    私はドキュメントを推測します here あなたを混乱させました。実際、sap.ui.model.ContextはパラメータとしてoModelとsPathのみを受け取ります。次のコードは sap-ui-core.js から取得したものです。パラメータに関するJSDoc部分が実際にコードと矛盾していることがわかります。たぶんあるタイプの誤植があるかもしれません。

    _/**
    * Constructor for Context class.
    *
    * @class
    * The Context is a pointer to an object in the model data, which is used to 
    * allow definition of relative bindings, which are resolved relative to the
    * defined object.
    * Context elements are created either by the ListBinding for each list entry
    * or by using createBindingContext.
    *
    * @param {sap.ui.model.Model} oModel the model
    * @param {String} sPath the path
    * @param {Object} oContext the context object
    * @abstract
    * @public
    * @name sap.ui.model.Context
    */
    var Context = sap.ui.base.Object.extend("sap.ui.model.Context", 
    /** @lends sap.ui.model.Context.prototype */  {
    
    constructor : function(oModel, sPath){
    
        sap.ui.base.Object.apply(this);
    
        this.oModel = oModel;
        this.sPath = sPath;
    
    },
    
    metadata : {
        "abstract" : true,
      publicMethods : [
            "getModel", "getPath", "getProperty", "getObject"
        ]
    }
    
    });
    _
  3. プログラミングの観点からは、以下が機能する理由がわかりません。

    パスのみを渡すmodel.bindList()を介してコンテキストにバインドするリストを作成します。
    変更イベントハンドラーをバインドにアタッチ
    バインディング時にget_contexts()を呼び出す
    変更イベントハンドラーでデータを受信します(モデルに入力されたoDataプロパティを参照してください)。

    そして、私が仮定するプロパティバインディングに対して同じことをする方法はないようです
    model.bindProperty()で生成できます。バインディングを生成できますが、バインディングは
    受信には、実際にデータをフェッチするハンドルがないようです。

    実際には、attachChangeイベントを_sap.ui.model.PropertyBinding_に送信することもできます。また、getValue()を呼び出してデータを取得できます。

8
Haojie

ありがとう、アレン、本当に助かった。これは主にドキュメントに関する混乱であり、getValueも私を滑らせました。

タイトルに暗黙的にのみ含まれている質問に別の回答を追加するには:

context binding:指定したパスに設定したバインディング。

バインディングコンテキスト:特定のバインディングのコンテキスト、つまり、コンポーネントまたは他のセットアップバインディングから取得した場合。

乾杯ミシェル

2
michel luther