【问题标题】:SAPUI5 Can't access a array and give it to a JSONModelSAPUI5 无法访问数组并将其提供给 JSONModel
【发布时间】:2020-05-03 08:27:58
【问题描述】:

我在访问数组时遇到问题,我将一些来自 omodel 读取的数据放入其中。该数组称为 aData 并包含表的行数据。这很好用,所有数据都在里面。

所有代码都是在打开值帮助对话框后完成的,我想在他/这个表中放置数据

        var oTestModel = this.getModel();
        oTestModel.read("/shrhelpSet", {
            filters: [oFilterObject, oFilterField, oFilterLang],
            success: function(oRetrieveResults){
                //console.log(oRetrieveResults);

                var oDatas2 = oRetrieveResults;
                var test1 = oDatas2.results;

                var aData = [];
                var index = oDatas2.results.length;
                var i;
                for (i=0; i<index; i++) {       

                    aData.push("{Key: '" + oDatas2.results[i].key + "', Value: '" + oDatas2.results[i].value + "'}");
                }

                // aData Array  
                console.log("aData: " + aData);

            },

            error: function(oError){
                console.log(oError);
            }
        });

此代码是在 omodel 读取之后。在这里,我有一个包含我的表的列数据的数组。 oModel2 包含我在 aColumnData 中定义的列数据 上面的行在 aData 中。这就是问题所在。它不返回(数组)数据或仅显示对象。您是否有更好地处理此问题的提示或解决此问题的方法?

        var aColumnData = [{
            columnId: "Key"
        }, {
            columnId: "Value"
        }];

        var oModel2 = new sap.ui.model.json.JSONModel();

        oModel2.setData({
            columns: aColumnData,
            rows: aData // THIS IS THE RESULT OF MY MODEL, the results are in aData but i cant access it here
        });

        oTable.setModel(oModel2);

        oTable.bindColumns("/columns", function(index, context) {
            var sColumnId = context.getObject().columnId;
            return new sap.ui.table.Column({
                id : sColumnId,
                label: sColumnId,
                template: sColumnId
            });
        });
        oTable.bindRows("/rows");

【问题讨论】:

  • 第二段代码直接跟在第一段后面吗?如果是这样,当您尝试使用数组填充模型时,成功方法可能尚未启动。将您的表绑定到 oTestModel 不是一个选项吗?
  • 是的,直接跟随。你确定吗。它完成了,然后进入第二个部分。我确信它成功了。将表绑定到 oTestModel 的问题是我无法绑定它,因为它是一个 sap.ui.table。我试过了,但对我有用的解决方案就是我所拥有的。我不知道,也许我也做错了什么
  • aData 数组是空的还是aData 没有定义?因为看起来您在成功处理程序中声明它并尝试在外部访问它。您能否尝试在“oTestModel.read(...)”之前声明变量“aData”。如果这没有帮助,那么 Samleijenhorst 可能是正确的,因为“读取”是异步的。这意味着,成功处理程序将在接收到数据时运行。这可能是在您的第二次剪辑已经运行之后。
  • 现在我在外面定义了它。运行后 aData 为空。你能解释一下为什么读取后的代码比读取本身先被调用。我不明白这一点。我是 sapui5 / javascript 的新手
  • 一旦从网络接收到数据,成功处理程序就会运行。这是异步的,这意味着代码执行不会停止并等待来自后端的数据,它会一直运行直到收到数据。此时,成功处理程序将运行。您无法确切知道成功处理程序何时运行,因为它取决于后端响应的速度。我会添加一个答案供您尝试。

标签: javascript data-binding sapui5 sap-fiori


【解决方案1】:

我认为问题可能是您正在推送字符串而不是数组中的对象:

aData.push("{Key: '" + oDatas2.results[i].key + "', Value: '" + oDatas2.results[i].value + "'}");

你的对象应该是这样的:

{
   Key: oDatas2.results[i].key,
   Value: oDatas2.results[i].value
}

【讨论】:

    【解决方案2】:

    尝试像这样将需要访问接收到的数据的代码移动到成功处理程序中。另外,我认为另一个答案是正确的,您需要创建对象而不是字符串。

    this.getModel().read("/shrhelpSet", {
    filters: [oFilterObject, oFilterField, oFilterLang],
    success: function (oRetrieveResults) {
        var aData = oRetrieveResults.results.map(function (oResult) {
            return {
                Key: oResult.key,
                Value: oResult.value
            };
        });
    
        var aColumnData = [{
            columnId: "Key"
        }, {
            columnId: "Value"
        }];
    
        var oModel = new sap.ui.model.json.JSONModel({
            columns: aColumnData,
            rows: aData
        });
    
        oTable.setModel(oModel);
    
        oTable.bindColumns("/columns", function (index, context) {
            var sColumnId = context.getObject().columnId;
            return new sap.ui.table.Column({
                id: sColumnId,
                label: sColumnId,
                template: sColumnId
            });
        });
    
        oTable.bindRows("/rows");
    }.bind(this),
    
    error: function (oError) {
        console.log(oError);
    }
    });
    

    【讨论】:

    • 非常感谢。这就是解决方案。我必须更多地了解异步、模型、ui5 等的过程。
    【解决方案3】:

    你的观点没有问题。

    var oTable = new sap.ui.table.Table({
      rows: '{/rows}',
      title: new sap.m.Title({
        text: "Test"
      })
    });
    
    oTable.bindColumns("/columns", function(index, context) {
      var sColumnId = context.getObject().columnId;
      return new sap.ui.table.Column({
        label: sColumnId,
        template: sColumnId
      });
    });
    
    var model = new sap.ui.model.json.JSONModel({
      columns: [{
        columnId: "Key"
      }, {
        columnId: "Value"
      }],
      rows: [
        { Key: "K1", Value: "V1" },
        { Key: "K2", Value: "V2" },
      ] 
    });
    
    oTable.setModel(model);
    oTable.placeAt('content');
    <!DOCTYPE HTML>
    <html>
      <head>
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta http-equiv='Content-Type' content='text/html;charset=UTF-8'/>
        <script src="https://sapui5.hana.ondemand.com/resources/sap-ui-core.js" 
                id="sap-ui-bootstrap"
                data-sap-ui-libs="sap.ui.commons,sap.ui.table,sap.m" 
                data-sap-ui-xx-bindingSyntax="complex"
                data-sap-ui-theme="sap_belize"></script>	
      </head>
      <body id="content" class="sapUiBody sapUiSizeCompact">
      </body>
    </html>

    看来您的模型不正确。也许您正试图像这样更改模型中的结果。

    success: function(oRetrieveResults){
        var aData = oRetrieveResults.results.map(function(data) {
            return {
                Key: '"' + data.key + '"',
                Value: '"' + data.value + '"'
            };
        });
        this.setProperty("/results", oData);
    },
    

    【讨论】:

    • 不,我没有更改它,我只是复制出键和值以将其保存在数组中
    猜你喜欢
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    相关资源
    最近更新 更多