通过 JSON 模型绑定事件

Bind an Event via a JSON Model

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

如果我这样做,它总是会抛出这个异常:

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

我有一个通用上下文菜单,它只需要一些配置即可创建。这就是我从我的控制器调用这个函数的方式:

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 示例。

您不能对事件使用数据绑定。 但是您可以为您的菜单项实现一个通用事件处理程序,它将调用适当的函数。

将菜单项 select 事件绑定到通用事件处理程序:

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() 可以调用给定 this 对象上的函数。

这里是 JSBin