Проблема с привязкой пользовательского составного элемента управления со скрытой агрегацией

#javascript #data-binding #sapui5

#javascript #привязка данных #sapui5

Вопрос:

Я сталкиваюсь с проблемой при выполнении привязки пользовательского элемента управления к агрегации. Я не могу выполнить двустороннюю привязку данных с внутренним элементом пользовательского элемента управления.

Пользовательский элемент управления:

 (function(){
    "use strict";

    var PriceRangeComponent = sap.ui.core.Control.extend('PriceRangeComponent', {
        constructor: function(mSettings) {
            sap.ui.core.Control.apply(this, arguments);

            this.ef = new sap.m.Input({
                width: '100px',
                value: mSettings.value,
                enabled: mSettings.enabled
            }).attachChange(function(evt){
                console.log(evt);
            });

            this.setAggregation('_ef', this.ef);
        },

        metadata: {
            properties: {
                enabled: { type: 'boolean', defaultValue: true },
                value: { type: 'String', defaultValue: "" }
            },

            events: {
            },

            aggregations: {
                _ef: { type: 'sap.m.Input', multiple: false, visibility: 'hidden' }
            }
        },

        init: function() {
        },

        renderer: function(oRM, oControl) {
            oRM.renderControl(oControl.getAggregation('_ef'));
        },

        setValue: function (sValue) {
            this.ef.setValue(sValue);
        },

        setEnabled: function (bValue) {
            this.ef.setEnabled(bValue);
        },

        getValue: function(){
            return this.ef.getProperty("value");
        },

        getEnabled: function(){
            return this.ef.getProperty("enabled");
        }

    });

    PriceRangeComponent.prototype.clone = function(){
        var clone = sap.ui.core.Control.prototype.clone.apply(this, arguments),
            bindingInfo;

        clone.ef.bindProperty("value",this.getBindingInfo("value"));

        return clone;
    };

    return PriceRangeComponent;
})();
  

В элементе управления я хочу выполнить двустороннюю привязку данных к внешней модели.

использование пользовательского элемента управления:

 var priceGridwindowShade = new sap.ui.commons.windowshade.WindowShade({
            openFirstSection:false,
            sections:[],
            //layoutData: new sap.ui.layout.GridData({span: "L9 M9"}),
            width: "800px",

        });

        var oTemplateSection = new sap.ui.commons.windowshade.WindowShadeSection({
            title: {
                parts: [
                    {path: "startRange"},{path: "endRange"}
                ],
                formatter: function(startRange, endRange){
                    //console.log(val);
                    return startRange   " to "   endRange;
                }
            },
            content: [
                new PriceRangeComponent({
                    value: "{startRange}"
                }),

                new sap.m.Input({ // this input is for checking the 2 way data binding
                    width: "80px",
                    value: "{startRange}"
                })
            ]
        });

        priceGridwindowShade.bindAggregation("sections", {
            path: "/items",
            template: oTemplateSection,
            templateShareable: true});

        return priceGridwindowShade;
  

Пожалуйста, помогите мне.
Когда я просто создаю экземпляр элемента управления и привязываю свойства, двусторонняя привязка работает должным образом. Просто он перестает работать, когда я выполняю привязку агрегации.

Ответ №1:

прежде всего, вы вообще не устанавливаете свойства вашего пользовательского элемента управления, а только свойства внутреннего ввода. Попробуйте sth. выполните подобное для всех установщиков и удалите получатели:

 setValue: function (sValue) {
  this.setProperty('value', sValue, true /* bSupressInvalidate */);
  this.ef.setValue(sValue);
},
  

И вам нужно заполнить значение вашего ввода в обратном порядке (сделайте это в init ):

 init: function() {
  this.ef = new sap.m.Input({
    width: '100px'
  }).attachChange(function(oEv) {
    this.setValue(oEv.getParameters("value"));
  }.bind(this));

  this.setAggregation('_ef', this.ef);
}
  

Еще несколько замечаний:

  • Для инициализации используйте init вместо переопределения constructor
  • Используйте AMD

Если вы используете более новую версию SAPUI5 (я думаю, 1.58 ), вы также можете ознакомиться с составными элементами управления XML.

Крис

Комментарии:

1. для моего примера выполнено изменение прикрепления. Но когда я сделал объявление в init, мой пример не работает с привязкой агрегации. Не могли бы вы, пожалуйста, создать примерный пример с привязкой агрегации с объявлением init.

2. Вы можете столкнуться с проблемами, потому что вы не записываете управляющие данные в свой рендерер. Вероятно, вам лучше расширить sap.m.Input и оставить средство визуализации нетронутым.