Связывание, Контекст, Контекстная привязка и BindingContext в ui5

Я обдумывал внутренности и отношения между контекстом, contextbinding и bindingcontext в течение нескольких дней, и я не уверен, есть ли на моей стороне большое заблуждение. Может быть, некоторые из вас могут помочь мне разобраться. Я делаю свои предположения ниже. Сначала я могу сказать, что я всегда работаю с моделями oData.

Это то, что я считаю понимающим для чтения документации:

Контекст - это ссылка на объект данных в модели.

Связывание - это в основном поставщик событий, который (в случае односторонней привязки) наблюдает за состоянием конкретного контекста и испускает события при его изменении/загрузке данных... и поэтому позволяет регистрировать обработчики событий для событий в этом конкретном контексте, Что касается объектов программирования, есть привязки свойств и привязки списков (это правда - или список привязывает все, что когда-либо имеет значение?).

Во всяком случае, я понимаю, что привязка списка является модельной стороной связывания агрегации компонентов, тогда как привязка свойства называется связыванием свойств как с точки зрения компонента, так и с точки зрения модели (запутанной?).

Теперь я не совсем понимаю: привязка контекста new sap.ui.model.ContextBinding(oModel, sPath, oContext, mParameters?, oEvents?): Принимает путь и контекст как параметр. Я предполагаю, что этот oContext - это не совсем контекст, описанный выше, а некоторые метаданные о привязке. это верно? Или это определение thep ath, которое имеет параметр пути относительно?

То, что также кажется странным, - это когда вы хотите создать сам контекст, new sap.ui.model.Contextabov(oModel, sPath, oContext) снова принимает контекст. Я считаю, что это всего лишь неудачная игра, на которую я смотрю, но я не совсем уверен.

Тогда есть contextbinding и bindingcontext. Я предполагаю, что contextBinding является привязкой к определенному контексту, как описано e. И bindingtexttext - это метаданные в отношении привязки context- или списка.

С точки зрения программирования я не понимаю, почему следующие работы:

  • создать привязку списка к контексту через model.bindList() передавая только путь.
  • присоединить обработчик события изменения привязки
  • вызов get_contexts() при привязке
  • получать данные в обработчике события изменения (и видеть свойство oData-свойство, заполненное моделью).

и, похоже, нет никакого способа сделать то же самое для привязки свойства, которое я бы предположил, что могу генерировать с помощью model.bindProperty(). Я могу сгенерировать привязку, но привязка, которую я получаю, кажется, не имеет дескриптора для фактического извлечения данных.

Надеюсь, этот вопрос объясняет мою проблему. Если вы спросите: что вы хотите сделать? Я на самом деле не хочу ничего с этим делать, я просто не совсем понимаю, как это работает. Привязка к элементам управления ui и т.д. Работает отлично, но я бы предпочел понять, что находится под капотом. Я немного читал файлы отладки и блок-тесты, но обсуждать их с вами, ребята, тоже замечательный способ.

Если это неясно, я с радостью добавлю все, что поможет.

Приветствие Мишель

Ответ 1

на ваши вопросы ответят ниже. Надеюсь, поможет.

  1. Теперь я не совсем понимаю: привязка контекста new sap.ui.model.ContextBinding(oModel, sPath, oContext, mParameters?, oEvents?): Принимает путь и контекст как параметр. Я предполагаю, что этот oContext - это не совсем контекст, описанный выше, а некоторые метаданные о привязке. это верно? Или это определение thep ath, которое имеет параметр пути относительно?

    oContext - это контекст, о котором вы говорили выше, если быть точным, это sap.ui.model.Context.

  2. То, что также кажется странным, - это когда вы хотите создать сам контекст, новый sap.ui.model.Context(oModel, sPath, oContext) снова принимает контекст. Я считаю, что это всего лишь неудачная игра, на которую я смотрю, но я не совсем уверен.

    Я предполагаю, что документация здесь смутила вас. Фактически, 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() для получения данных.

Ответ 2

Спасибо, Аллен, это действительно помогло. В основном это была путаница в отношении документации, и getValue тоже меня поскользнулся.

Чтобы добавить еще один ответ на вопрос, который неявно включен в заголовок:

context binding: привязка, которую вы установили для заданного пути.

контекст привязки: контекст заданного связывания, то есть при выходе из компонента или какой-либо другой привязки.

Приветствие Мишель