Javascript SAPUI5罐';t访问数组并将其交给JSONModel

Javascript SAPUI5罐';t访问数组并将其交给JSONModel,javascript,data-binding,sapui5,sap-fiori,Javascript,Data Binding,Sapui5,Sap Fiori,我在访问数组时遇到问题,在数组中我从omodel读取了一些数据。该数组称为aData,它包含表的行数据。这很好,所有数据都在那里 所有代码都是在打开“值帮助”对话框后完成的,我想将数据放在他/这个表中 var oTestModel = this.getModel(); oTestModel.read("/shrhelpSet", { filters: [oFilterObject, oFilterField, oFilterLang],

我在访问数组时遇到问题,在数组中我从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);
            }
        });

你的观点没有问题

var-oTable=new sap.ui.table.table({
行:“{/rows}”,
标题:新sap.m.title({
文本:“测试”
})
});
oTable.bindColumns(“/columns”,函数(索引,上下文){
var sColumnId=context.getObject().columnId;
返回新的sap.ui.table.Column({
标签:sColumnId,
模板:sColumnId
});
});
var model=new sap.ui.model.json.JSONModel({
栏目:[{
columnId:“键”
}, {
columnId:“值”
}],
行:[
{键:“K1”,值:“V1”},
{键:“K2”,值:“V2”},
] 
});
setModel(model);
可旋转。放置在(“内容”)

您的视图没有问题

var-oTable=new sap.ui.table.table({
行:“{/rows}”,
标题:新sap.m.title({
文本:“测试”
})
});
oTable.bindColumns(“/columns”,函数(索引,上下文){
var sColumnId=context.getObject().columnId;
返回新的sap.ui.table.Column({
标签:sColumnId,
模板:sColumnId
});
});
var model=new sap.ui.model.json.JSONModel({
栏目:[{
columnId:“键”
}, {
columnId:“值”
}],
行:[
{键:“K1”,值:“V1”},
{键:“K2”,值:“V2”},
] 
});
setModel(model);
可旋转。放置在(“内容”)

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

aData.push("{Key: '" + oDatas2.results[i].key + "', Value: '" + oDatas2.results[i].value + "'}");
您的对象应该是这样的:

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

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

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

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

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

第二段代码是否直接跟随第一段代码?如果是这样,当您试图使用数组填充模型时,成功方法可能尚未启动。将表绑定到oTestModel不是一个选项吗?是的,直接执行以下操作。你确定。它完成了,然后进入第二部分。我相信它会成功的。将表绑定到oTestModel的问题是我无法绑定它,因为它是一个sap.ui.table。我试过了,但对我有效的解决方案是我拥有的。我不知道,可能是我做错了什么,因为aData数组是空的还是没有定义aData?因为它看起来像是您在成功处理程序中声明它,然后尝试在外部访问它。您能否尝试在“oTestModel.read(…)”之前声明变量“aData”。如果这没有帮助,那么Samleijenhorst可能是正确的,因为“读取”是异步的。这意味着,成功处理程序将在收到数据时运行。这可能是在你的第二次截击已经开始后。现在我在外面定义它。运行后数据为空。你能解释一下为什么读取后的代码比读取本身先被调用吗。我不明白。我不熟悉sapui5/Javascript。一旦从网络接收到数据,成功处理程序就会运行。这是异步的,这意味着代码执行不会停止并等待来自后端的数据,它将保持运行,直到收到数据。此时,成功处理程序将运行。您无法确切知道sucess处理程序何时运行,因为它取决于后端响应的速度。我将添加一个答案供您尝试。第二段代码是否直接跟随第一段代码?如果是这样,当您试图使用数组填充模型时,成功方法可能尚未启动。将表绑定到oTestModel不是一个选项吗?是的,直接执行以下操作。你确定。它完成了,然后进入第二部分。我相信它会成功的。将表绑定到oTestModel的问题是我无法绑定它,因为它是一个sap.ui.table。我试过了,但对我有效的解决方案是我拥有的。我不知道,可能是我做错了什么,因为aData数组是空的还是没有定义aData?因为它看起来像是您在成功处理程序中声明它,然后尝试在外部访问它。您能否尝试在“oTestModel.read(…)”之前声明变量“aData”。如果这没有帮助,那么Samleijenhorst可能是正确的,因为“读取”是异步的。这意味着,成功处理程序将在收到数据时运行。这可能是在你的第二次截击已经开始后。现在我在外面定义它。运行后数据为空。你能解释一下为什么读取后的代码比读取本身先被调用吗。我不明白。我不熟悉sapui5/Javascript。一旦从网络接收到数据,成功处理程序就会运行。这是异步的,这意味着代码执行不会停止并等待来自后端的数据,它将保持运行,直到收到数据。此时,成功处理程序将运行。您无法确切知道sucess处理程序何时运行,因为它取决于后端响应的速度。我将添加一个答案供您试用。不,我没有更改它,我只是复制了密钥和值以将其保存在阵列中。不,我没有更改它,我只是复制了密钥和值以将其保存在阵列中。非常感谢。这就是解决办法。我必须更多地了解异步、模型、ui5等的过程。非常感谢。这就是解决办法。我必须对t有更多的了解