2016-01-21 2 views
1

Интересно, возможно ли связать событие через JSONModel.Связать событие с помощью модели JSON

Если я так, он всегда будет бросать это исключение:

Uncaught TypeError: I.fFunction.call is not a function

Это мой код:

_ViewReference: undefined, 
_oMenuItemsConfigModel: undefined, 
createMenu: function(oItem){ 
    if (!this._menu) { 
     this._menu = new sap.ui.unified.Menu(this._oMenuConfig); 
     this._menu.setModel(this._oMenuItemsConfigModel); 

     this._menu.bindAggregation("items", "/", new sap.ui.unified.MenuItem({ 
      text: "{text}", 
      icon: "{icon}", 
      select: "{select}", 
      enabled: "{enabled}" 
     })); 

     this._ViewReference.addDependent(this._menu); 
    } 

    var eDock = sap.ui.core.Popup.Dock; 
    this._menu.open(false, oItem, eDock.BeginTop, eDock.BeginBottom, oItem); 
    return oItem; 
} 

У меня есть универсальный ContextMenu, который просто необходим конфигурации для того, чтобы получить создан , Это, как я называю эту функцию из моего контроллера:

var oContextMenu = new ContextMenu(this.getView(), 
    new sap.ui.model.json.JSONModel(
     [ 
      { 
       text: "Copy", 
       select: [this.onContextMenuItemCopySelected, this] 
      }, 
      { 
       text: "Paste", 
       select: [this.onContextMenuItemPasteSelected, this] 
      } 
     ] 
    ) 
); 

Вот JSBin пример.

ответ

1

Вы не можете использовать привязку данных для событий. Но вы можете реализовать универсальный обработчик событий для ваших элементов меню, которые вызовут соответствующую функцию.

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

this._menu.bindAggregation("items", "/", new sap.ui.unified.MenuItem({ 
       text: "{text}", 
       select: [this.onSelect, this] 
      })); 

и реализовать обработчик вроде этого:

onSelect:function(oEvent){ 
      var item = oEvent.getParameter("item"); 
      var context = item.getBindingContext(); 
      var fnConfig = context.getProperty("select"); 
      fnConfig[0].bind(fnConfig[1])(); 

     } 

fnConfig является массив функцией, и этого-объекта из модели , Использование Function.bind() позволяет вам вызвать функцию на данном объекте.

Здесь на JSBin

+0

Он работает в JSBin, не так ли? И, пожалуйста, учтите, что я добавил функции 'onContextMenuItemCopySelected' и' onContextMenuItemPasteSelected' для контроллера в примере JSBin. У вас есть некоторые отличия от вашего примера JSBin в вашем реальном коде? – schnoedel

+0

нет, конечно, он работает! Но я серьезно не понимаю, почему это не работает с привязкой! Тем не менее, это отличная работа. –

+0

SAP реализовал привязку данных только для ассоциаций свойств и агрегаций. Его все в [ManagedObject] (https://sapui5.netweaver.ondemand.com/#docs/api/symbols/sap.ui.base.ManagedObject.html). Я предполагаю, что они предполагают, что содержание модели всегда является только данными. Загружается из веб-сервиса, который является истинным, но ваш пример является хорошим контрпримером. – schnoedel

Смежные вопросы