通过JSON模型绑定事件

时间:2016-01-21 19:39:59

标签: javascript model-binding sapui5

我想知道是否可以通过JSONModel绑定一个事件。

如果我这样做,它将始终抛出此异常:

  

未捕获的TypeError:I.fFunction.call不是函数

这是我的代码:

_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;
}

我有一个Universal ContextMenu,只需要一些配置才能创建。这就是我从Controller中调用此函数的方法:

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 个答案:

答案 0 :(得分: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是函数的数组,来自模型的this-object。 使用Function.bind()可以调用给定此对象的函数。

此处位于JSBin