6

我正在尝试使用 SAPUI5 访问 REST 服务。我在 jQuery 的帮助下发送了一个 GET 请求并期待一个 JSON 响应,但我得到的只是一个空的 JSON 对象。但是,使用 RESTClient 测试的 REST 服务给了我正确的响应。

这是我正在使用的代码:

看法

sap.ui.jsview("sapui5_test.SAPUI5_Test", { 

    getControllerName : function() {
        return "sapui5_test.SAPUI5_Test";
    },

    createContent : function(oController) {

    var text = new sap.ui.commons.TextField( {  
        width : "100%"  
    }); 

// arrange controls on the page with a matrix layout  
    var ml = new sap.ui.commons.layout.MatrixLayout( {  
        columns : 2,  
        layoutFixed : true,  
        width : "500px"  
    }); 

    ml.addRow(new sap.ui.commons.layout.MatrixLayoutRow( {  
        cells : [  
            new sap.ui.commons.layout.MatrixLayoutCell( {  
                content : [ text ]  
            })]  
    }));

    var model = oController.initTodoModel();

    text.setValue(model.getJSON());
    return [ ml ];
    }   



});

控制器

sap.ui.controller("sapui5_test.SAPUI5_Test", {

initTodoModel : function() {  
            var oModel = new sap.ui.model.json.JSONModel();
            var aData = jQuery.ajax({
                type : "GET",
                contentType : "application/json",
                url : "http://sapm04.ibsolution.local:50000/demo.sap.com~d337_resttest_web/rest/todo/init/",
                dataType : "json",
                success : function(data,textStatus, jqXHR) {
                    oModel.setData({modelData : data}); 
                    alert("success to post");
                }

            });

            return oModel;  
        }
}

});

索引.html

<!DOCTYPE HTML>
<html>
<head>
        <meta http-equiv="X-UA-Compatible" content="IE=edge">

      <script src="resources/sap-ui-core.js"
            id="sap-ui-bootstrap"
              data-sap-ui-libs="sap.ui.commons,sap.ui.table,sap.ui.ux3"
            data-sap-ui-theme="sap_goldreflection">
    </script>
    <!-- add sap.ui.table,sap.ui.ux3 and/or other libraries to 'data-sap-ui-libs' if required -->

    <script>
            sap.ui.localResources("sapui5_test");
            var view = sap.ui.view({id:"idSAPUI5_Test1", viewName:"sapui5_test.SAPUI5_Test", type:sap.ui.core.mvc.ViewType.JS});
            view.placeAt("content");
    </script>

</head>
<body class="sapUiBody" role="application">
    <div id="content"></div>
</body>

如前所述,当我在 RESTClient 中运行与 jQuery 中相同的 URL 时,我得到一个填充的 JSON 对象,但是 UI5 页面中的结果是一个空的 JSON 对象 {}。

我还尝试了以下解决方案:

var oModel = new sap.ui.model.json.JSONModel("http://sapm04.ibsolution.local:50000/demo.sap.com~d337_resttest_web/rest/todo/init/");

但这没有帮助。

4

1 回答 1

11

嗯,原因很明显。控制器中的return语句在 json 对象填充数据之前完成执行。这是因为$.ajax调用是异步的,这意味着 JavaScript 会调用后端服务器并且不会等到发送答案,而是 JavaScript 会直接进入下一条指令,即return oModeloModel填充数据之前。如果您向后端发出同步请求,您的问题将得到解决,您可以这样做:

 sap.ui.controller("sapui5_test.SAPUI5_Test", {

 initTodoModel : function() {  
        var oModel = new sap.ui.model.json.JSONModel();
        var aData = jQuery.ajax({
            type : "GET",
            contentType : "application/json",
            url : "http://sapm04.ibsolution.local:50000/demo.sap.com~d337_resttest_web/rest/todo/init/",
            dataType : "json",
            async: false, 
            success : function(data,textStatus, jqXHR) {
                oModel.setData({modelData : data}); 
                alert("success to post");
            }

        });

        return oModel;  
    }
  }

 });

但是,不建议使用同步调用,因为它会在请求完成之前暂停应用程序。

为什么不应该使用同步请求?

想象一下在调用结束之前暂停您的应用程序。对于少数请求来说,这可能不是什么大问题,但如果您有一个需要与后端数据提供者进行大量交互的大型应用程序,那么这将是一个主要问题。

设计改进建议:

如果由我决定,我会设计应用程序,以便能够将回调函数注册到 ajax 请求中。因此应用程序将遵循设计模式之类的责任链,当数据准备好时,依赖于它的模块将被执行,并且不会停止应用程序的其他模块。

简单来说,通过在成功函数内而不是在调用外调用函数来对数据做任何你想做的事情$.ajax

于 2013-11-21T10:01:19.660 回答