SAPUI5 无法访问数组并将其提供给 JSONModel

SAPUI5 Can't access a array and give it to a JSONModel

我在访问数组时遇到问题,我将一些数据从 omodel 读取。该数组称为 aData,其中包含 table 的行数据。这工作正常,所有数据都在那里。

所有代码都是在打开值帮助对话框后完成的,在 his/this table 我想放入数据

        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读取后的。这里我有一个数组,其中包含 table 的列数据。 oModel2 包含我在 aColumnData 中定义的列数据 上面的行在 aData 中。这就是问题所在。它 returns(数组)没有数据或仅显示对象。您有更好地处理这个问题的技巧或解决这个问题的方法吗?

        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");

您的观点没有问题。

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);
},

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

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

你的对象应该是这样的:

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

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

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);
}
});