SAPUI5:getModel如果在setModel的同一函数中调用,则返回undefined

SAPUI5:getModel如果在setModel的同一函数中调用,则返回undefined,sapui5,Sapui5,我试图设置一个模型,并在按下某个按钮后从OData检索它 问题是,当我在设置模型之后立即调用getModel时,它返回undefined 但是,如果我从另一个函数调用getModel(在从其他函数调用模型之后),它将返回所需的输出 参考代码: onPressButton1: function(){ var vEntityURL = "/CustomerSet(ID='000')"; var sServiceUrl = "

我试图设置一个模型,并在按下某个按钮后从OData检索它

问题是,当我在设置模型之后立即调用getModel时,它返回undefined

但是,如果我从另一个函数调用getModel(在从其他函数调用模型之后),它将返回所需的输出

参考代码:

onPressButton1: function(){
            var vEntityURL = "/CustomerSet(ID='000')";
            var sServiceUrl = "/Customers_SRV/";
            var oServiceModel = new sap.ui.model.odata.ODataModel(sServiceUrl, true);
            var oJsonModel = new sap.ui.model.json.JSONModel();

            oServiceModel.read(vEntityURL, {
                success: function(oData) {
                    oJsonModel.setData(oData);
                }
            });

            this.getView().setModel(oJsonModel, "Customers");

            var oCustomer = this.getView().getModel("Customers");
            console.log(oCustomer.getProperty("/Name"));
}
以上返回控制台中未定义的

但是,如果我按下另一个具有以下功能的按钮,将起作用

onPressButton2: function(){
                var oCustomer = this.getView().getModel("Customers");
                console.log(oCustomer.getProperty("/Name"));
    }

这不是sapui5问题,这是异步代码的常见行为:您可以确保只有在
read
方法的成功回调中才有数据


将最后三行代码移到success函数中,您就完成了:-)

有点偏离主题,但是为什么您仍然使用不推荐的
sap.ui.model.odata.ODataModel
?你从哪里得到代码的?你在学习哪个教程?为什么不是官方文件呢?对了@Boghyonhofmann,我错过了@BoghyonHoffmann因为某种原因返回一个错误
odata.v2
,即使我在控制器模块中定义了数据服务请求,但由于语法错误,无法理解该请求。@Abdulelah请升级到
v2.ODataModel
,并打开一个带有错误消息的新问题,如果可能,请打开一个新问题。应该避免使用不推荐使用的ODataModel,因为它严重依赖于同步XHR,导致用户体验不佳。是的,这是可行的,但我如何才能调用以“this.fDoThis();”这样的关键字开头的函数,甚至在成功之外编辑对象模型?非常感谢。一旦设置了模型,您就可以像在onPressButton2功能中一样执行各种操作,从模型本身检索数据。我强烈建议您深入研究MVC模式,在官方文档中,我一定会检查这一点,因为UI5对我来说是新的。我现在了解到,在调用我的整个“onPressButton1”函数之后,将调用设置模型的“success”函数。您能告诉我如何首先调用success吗?当引发oServiceModel.read函数的“success”事件时,success函数将自动触发。换句话说,当数据准备就绪时,发出读取请求,异步触发成功事件并调用自定义函数。所以我不明白你说的“呼叫成功第一”是什么意思,很抱歉,你能做到这一点的唯一方法是将你的逻辑转移到成功函数中,或者将你的呼叫包装在承诺中。看一看: