为什么本地 Unique ID 与 HCP 中的 ID 不一致?

Why local Unique IDs inconsistent with IDs in HCP?

我检查了应用程序中运行在HCP本地的元素,id是application-MaintainMasterData-display-component---addRoute--form,但是当我部署到云端时,id变成了application-MaintainFleet-Display-component---addRoute--form

应用名称变了,上class方式的display,导致我的sap.ui.getCore().byId()入云失败。我很困惑为什么会这样。

我已经阅读了参考资料,我在事件处理程序中,我需要 oEvent 范围,所以 this.getView().byId()this.createId() 对我不起作用。

参考:

sap.ui.getCore().byId() returns no element

https://sapui5.netweaver.ondemand.com/sdk/#docs/guide/91f28be26f4d1014b6dd926db0e91070.html

=========更新=========

我也试过sap.ui.getCore().byId("application-MaintainMasterData-display-component---addRoute").byId("form"),但同样的问题,view id在云端application-MaintainFleet-Display-component---addRoute

ID 是动态生成的。所以你不能依赖他们。这就是为什么你不应该使用 sap.ui.getCore().byId()。甚至分隔符 ----- 将来也可能会更改。

您应该始终使用最近的视图或组件的 byId() 方法来解析本地 ID。您可以链接调用:component.byId("myView").byId("myControl")

在你的事件处理程序中 this 应该指的是控制器。对于 XMLViews,这应该是无需进一步处理的情况。

所以我猜你正在使用 JSViews?如果在代码中附加事件处理程序,则始终可以向 attachWhatever() 函数提供第二个参数:在事件处理程序中变为 this 的对象。

Controller.extend("myView", {
  onInit:function(){
    var button = this.byId("button1");
    button.attachPress(this.onButtonPress, this); //The second parameter will become 'this' in the onButtonPress function
  },
  onButtonPress: function(oEvent){
    console.log(this); //this is the controller
    var buttonPressed = oEvent.getSource(); //get the control that triggered the event.
    var otherControl = this.byId("table"); //access other controls by id
    var view = this.getView(); //access the view
  }
});

如果您使用的是设置对象语法,您可以为事件提供一个数组。它应该包含处理函数和应该成为 this:

的对象
createContent:function(oController){
  return new Button({
    text: "Hello World",
    press: [ 
      function(oEvent){ console.log(this); }, //the event handler
      oController //oController will be 'this' in the function above
    ]
  });

如果您附加到非 UI5 事件,您始终可以使用闭包将视图或控制器提供给处理函数:

onInit:function(){
  var that = this; //save controller reference in local variable
  something.on("event", function(){ console.log(that); }); 
                //you can use that local variable inside the eventhandler functions code.
}