【问题标题】:SAPUI5 - How can I get the name of the model to which my Custom Control has been bound?SAPUI5 - 如何获取我的自定义控件已绑定到的模型的名称?
【发布时间】:2019-02-28 13:18:55
【问题描述】:

我正在处理 SAPUI5 中的自定义控件。目标是一个带有可点击段的饼图。每当点击一个片段时,应该触发一个事件,其中包含被点击片段的绑定上下文(例如“/testdata/2”)。附加函数使用上下文来了解单击了哪个段(例如,在标签中显示其名称)。

由于函数 getBindingContext 总是需要模型名称(或未定义)来提取当前上下文,因此我必须在测试期间对模型名称(“用法”)进行硬编码以使其工作。然而后来(当这个控件被其他人使用时)该模型名称显然与我在这里使用的不同。那么如何在不知道绑定模型的名称的情况下获取当前绑定上下文呢?

当前(相关)实现如下:

示例 XML 视图:

<demo:PieChart id="testchart" segments="{usage>/testdata}">
    <demo:Segment color="{usage>color}" size="{usage>size}"/>
</demo:PieChart>
<Label id="testlabel" text="{usage>name}"/>

测试数据(usage.json):

{
    "testdata": [
        {
            "name": "test_name_1",
            "size": 123,
            "color": "rgb(100,140,100)"
        },
        ...
    ]
}

在“段”内:

onclick: function(Event) {
    // Hard-coded modelname inside Control, this won't work later :/
    var context = this.getBindingContext("usage").getPath();
    this.getParent().fireSegmentClick({context: context});
}

在“饼图”内部:

metadata: {
    ...
    aggregations: {
        segments: {
            type: "demo.Segment"
        }
    },
    defaultAggregation: "segments",
    events: {
        segmentClick: {
            allowPreventDefault: true
        }
    }
}

控制器中的示例附件:

onInit: function() {
    var chart = this.byId("testchart");
    var label = this.byId("testlabel");
    chart.attachSegmentClick(function(Event) {
        var context = Event.getParameter("context");
        // The user knows the modelname here (he bound it).
        // But how do I get that name inside the Control?
        label.bindObject({path: context, model: "usage"});
    });
}

我最好的尝试: 在段的 onclick 函数中我可以调用

var model = this.getParent().getBinding("segments").getModel();

这让我得到了我想要的模型。但是由于 model.toString() 或 model.getName() 都不能给我它的名字,这是没有用的(因为 getBindingContext() 不想要模型本身,但它的名字......)

感谢任何帮助!

PS:一些(希望是)有用的链接:

Binding Reference

getBindingContext Reference

Related first answer

【问题讨论】:

    标签: javascript model sapui5 custom-controls binding-context


    【解决方案1】:

    那么如何在不知道绑定模型的名称的情况下获取当前绑定上下文呢?

    问题在于一个控件(或 ManagedObject)可以同时存储多个模型,所有模型都具有不同的名称。因此,即使控件“知道”所有模型名称,也很难猜测应用程序想要哪一个可用的绑定上下文,因为它们可能有零个或多个。

    从技术上讲,正如 krisho 的回答所暗示的那样,这肯定是可能的。但在我看来,将绑定上下文传播到应用程序不是控件的责任。正如您所提到的,只有应用程序知道所有模型及其名称,因此,它需要什么样的上下文。以下是我的建议:

    控件

    细分

    onclick: function(oEvent) {
      const parent = this.getParent();
      if (parent && parent.isA("demo.PieChart")) {
        parent.fireSegmentClick({
          segment: this, // deliver the clicked segment instead of some context(s)
        });
      }
    },
    

    饼图

    metadata: {
      //...
      aggregations: {
        segments: {
          type: "demo.Segment",
        },
      },
      defaultAggregation: "segments",
      events: {
        segmentClick: {
          allowPreventDefault: true,
          parameters: {
            segment: {
              type: "demo.Segment",
            },
          },
        },
      },
    },
    

    应用

    onSegmentClick: function(event) {
      const segment = event.getParameter("segment");
      const boundContext = segment.getBindingContext(/*I know the model name*/);
      // ...
    },
    

    这可以实现控件和应用程序/模型之间的松散耦合。

    【讨论】:

    • 感谢您的意见!作为预期工作,事后看来是显而易见的事情。以前我假设(无论出于何种原因)事件参数只能是元素 JS 类型,所以我尝试传递一个字符串而不是对象本身。从现在开始会牢记这一点 =)
    【解决方案2】:

    你可以试试这个吗?

    .getBindingInfo("segments").parts[0].model
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多