web-dev-qa-db-fra.com

Binding, Context, ContextBinding et BindingContext dans ui5

Je réfléchis depuis quelques jours aux aspects internes et à la relation entre le contexte, la liaison de contexte et le contexte de liaison et je ne sais pas s'il y a une idée fausse majeure de mon côté. Peut-être que certains d'entre vous peuvent m'aider à faire le tri. Je mets mes hypothèses ci-dessous. Je voudrais d'abord dire que je travaille toujours avec des modèles oData ici.

Voici ce que je pense comprendre en lisant la documentation:

Un contexte est une référence à un objet de données dans un modèle.

A binding est fondamentalement un fournisseur d'événements qui (dans le cas d'une liaison à sens unique) observe l'état d'un contexte spécifique et émet des événements lorsqu'il est modifié/chargé de données ... et permet donc d'enregistrer l'événement gestionnaires d'événements sur ce contexte spécifique. En termes de programmation d'objets, il existe des liaisons de propriété et des liaisons de liste (est-ce vrai - ou la liaison de liste est-elle tout ce qui est pertinent?).

Quoi qu'il en soit, ma compréhension est qu'une liaison de liste est le côté modèle de la liaison d'agrégation d'un composant, tandis qu'une liaison de propriété est appelée liaison de propriété à la fois du point de vue d'un composant et d'un modèle (confus?).

Maintenant, ce que je ne comprends pas vraiment, c'est: la liaison de contexte new sap.ui.model.ContextBinding(oModel, sPath, oContext, mParameters?, oEvents?): prend un chemin et un contexte comme paramètre. Je suppose que cet oContext n'est pas exactement le contexte décrit ci-dessus mais quelques métadonnées sur la liaison. est-ce correct? Ou est-ce là la définition de la valeur à laquelle le paramètre path est relatif?

Ce qui semble également étrange, c'est quand vous voulez créer un contexte lui-même new sap.ui.model.Contextabov(oModel, sPath, oContext) reprend un contexte. Je crois que c'est juste une chose malheureuse que je regarde, mais je ne suis pas tout à fait sûr.

Ensuite, il y a la liaison de contexte et le contexte de liaison. Je suppose que contextBinding est la liaison à un contexte spécifique comme décrit e. Et un contexte de liaison est les métadonnées concernant une liaison de contexte ou de liste.

Du point de vue de la programmation, je ne comprends pas pourquoi les éléments suivants fonctionnent:

  • créer une liaison de liste au contexte via model.bindList() en passant uniquement un chemin.
  • attacher le gestionnaire d'événement de changement à la liaison
  • appeler get_contexts() lors de la liaison
  • recevoir des données dans le gestionnaire d'événement change (et voir la propriété oData remplie dans le modèle).

et il semble qu'il n'y ait aucun moyen de faire de même pour une liaison de propriété que je suppose que je peux générer via model.bindProperty(). Je peux générer la liaison, mais la liaison que je reçois ne semble pas avoir de poignée pour récupérer réellement les données.

J'espère que la randonnée explique mon problème. Si vous demandez: que voulez-vous faire? En fait, je ne veux rien faire avec ça, je ne comprends tout simplement pas comment cela fonctionne. La liaison aux commandes de l'interface utilisateur et ainsi de suite fonctionne très bien, mais je préfère vraiment comprendre ce qui se trouve sous le capot. J'ai lu un peu les fichiers de débogage et les tests unitaires, mais en discuter avec vous semble également un excellent moyen.

Si cela n'est pas clair, j'ajouterai volontiers tout ce qui peut aider.

Vive Michel

17
michel luther

vos questions sont répondues ci-dessous. J'espère que ça aide.

  1. Maintenant, ce que je ne comprends pas vraiment, c'est que le contexte liant new sap.ui.model.ContextBinding(oModel, sPath, oContext, mParameters?, oEvents?): prend un chemin et un contexte comme paramètre. Je suppose que cet oContext n'est pas exactement le contexte décrit ci-dessus mais quelques métadonnées sur la liaison. est-ce correct? Ou est-ce là la définition de la valeur à laquelle le paramètre path est relatif?

    oContext est le contexte que vous avez mentionné ci-dessus, pour être précis, est sap.ui.model.Context.

  2. Ce qui semble également étrange, c'est quand vous voulez créer un contexte lui-même new sap.ui.model.Context(oModel, sPath, oContext) reprend un contexte. Je crois que c'est juste une chose malheureuse que je regarde, mais je ne suis pas tout à fait sûr.

    Je suppose que la documentation ici vous a dérouté. En fait, sap.ui.model.Context ne prend que oModel et sPath comme paramètres. Le code suivant est ce que j'obtiens de sap-ui-core.js . Vous pouvez voir que la partie JSDoc sur les paramètres est en fait incohérente avec le code. Peut-être y a-t-il une sorte de faute de frappe.

    /**
    * 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. Du point de vue de la programmation, je ne comprends pas pourquoi les éléments suivants fonctionnent:

    créer une liaison de liste au contexte via model.bindList () en passant uniquement un chemin.
    attachez le gestionnaire d'événement de changement à la liaison
    appelez get_contexts () lors de la liaison
    recevoir des données dans le gestionnaire d'événements de changement (et voir la propriété oData remplie dans le modèle).

    et il semble qu'il n'y ait aucun moyen de faire de même pour une liaison de propriété que je suppose
    Je peux générer via model.bindProperty (). Je peux générer la liaison, mais la liaison I
    receive semble n'avoir aucun descripteur pour réellement récupérer les données.

    En fait, vous pouvez également attachChange événement vers sap.ui.model.PropertyBinding, Et vous pouvez appeler getValue () pour obtenir les données.

8
Haojie

Merci, Allen, cela a vraiment aidé. C'était vraiment principalement une confusion concernant la documentation et le getValue m'a aussi glissé.

Pour ajouter une autre réponse à une question incluse implicitement dans le titre:

liaison de contexte: la liaison que vous avez configurée pour un chemin donné.

contexte de liaison: le contexte d'une liaison donnée, c'est-à-dire lorsqu'il provient d'un composant, ou d'une autre liaison établie.

Vive Michel

2
michel luther