SAP UI5出现this.byId(...).close is not a function报错求助
问题描述
开发SAP UI5应用时,参照官方walkthrough教程及Youtube平台Brandon的配套教学代码编写Dialog弹窗逻辑,触发关闭弹窗操作时抛出TypeError: this.byId(...).close is not a function错误,多次调整代码甚至直接复制官方示例代码运行,仍报相同错误。
涉及代码如下:
Next.controller.js
sap.ui.define([ "sap/ui/core/mvc/Controller", "sap/m/MessageToast", "sap/ui/core/Fragment"], function (Controller, MessageToast, Fragment) { "use strict"; return Controller.extend("sap.ui.demo.walkthrough.controller.HelloPanel", { onShowHello : function () { // 从i18n模型读取提示文本 var oBundle = this.getView().getModel("i18n").getResourceBundle(); var sRecipient = this.getView().getModel().getProperty("/recipient/name"); var sMsg = oBundle.getText("helloMsg", [sRecipient]); // 弹出消息提示 MessageToast.show(sMsg); }, onOpenDialog : function () { if (!this.pDialog) { this.pDialog = this.loadFragment({ name: "sap.ui.demo.walkthrough.view.HelloDialog" }); } this.pDialog.then(function(oDialog) { oDialog.open(); }); }, onCloseDialog : function () { // 官方注释说明:不需要链式调用pDialog的promise,因为该事件只会在弹窗加载完成后从内部触发 this.byId("HelloDialog").close(); } });});
HelloDialog.fragment.xml
<core:FragmentDefinition xmlns="sap.m" xmlns:core="sap.ui.core"> <Dialog id="helloDialog" title="hello {/recipient/name}"> <beginButton> <Button text="{i18n>dialogclose}" press=".onCloseDialog"/> </beginButton> </Dialog></core:FragmentDefinition>
报错原因
核心问题是控件ID大小写不匹配:
HelloDialog.fragment.xml里给Dialog控件设置的id是helloDialog,首字母h是小写Next.controller.js的onCloseDialog方法里,this.byId()传入的参数是"HelloDialog",首字母H是大写
SAP UI5的控件ID匹配和JavaScript本身一样,是严格区分大小写的,ID对不上会导致this.byId()根本找不到对应的Dialog实例,返回undefined,对undefined调用.close()方法自然会报"不是一个函数"的错。
修复方案
两种改法选一种就行:
- 改controller里的ID参数,和fragment里的ID大小写完全对齐,把
onCloseDialog方法改成:
onCloseDialog : function () { this.byId("helloDialog").close(); }
- 更稳妥的写法是直接复用之前缓存的
this.pDialog实例,不用再通过ID查找控件,从根源避免ID写错的问题:
onCloseDialog : function () { this.pDialog.then(oDialog => oDialog.close()); }
改完之后弹窗就能正常关闭,不会再抛这个错误。
内容的提问来源于stack exchange,提问作者BIGEYE 06
相关产品推荐
相关产品推荐

