【问题标题】:SAPUI5 get single property from JSON-ModelSAPUI5 从 JSON-Model 获取单个属性
【发布时间】:2014-10-10 08:27:31
【问题描述】:

我目前正在尝试弄清楚如何从 sap.ui.model.json.JSONModel 中检索单个值

在我的主要观点中:

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

var getConfigCallback = function(config) {
    gConfigModel.setData(config);
};

oController.getConfiguration(getConfigCallback);
console.log(gConfigModel);

在我的控制器中:

getConfiguration : function(callback) {

    var sServiceUrl = "/sap/opu/odata/sap/xxx/ConfigurationSet('Initialize')";

    var config = {};
    callback(config);

    $.getJSON(sServiceUrl).done(function(data) {
        config = data.d;
        callback(config);
    });
},

在我的 console.log 语句中,我可以看到数据已成功从后端传递并成功设置为 JSON 模型。我的要求是将属性 Editable 的值存储在单个变量中。

我已经尝试过 gConfigModel.getProperty('/'),​​没有用。试图访问 gConfigModel.oData 未定义。如何将其存储在单个值中?

解决方案评论:如果您从后端捕获数据,则必须注意它需要多长时间。数据可以在预期的时间后可用,在我的情况下,我添加了 1s 超时,之后我可以轻松访问该属性

 setTimeout(function() {
     console.log(gConfigModel.getProperty('/Editable'));
 }, 1000);

【问题讨论】:

  • getData() 应该返回对象 oData。所以要访问 Editable 只需使用 var editable = gConfigModel.getData().Editable;
  • getData() 方法返回一个对象,该对象下面没有节点或属性 .. :( 我错过了什么?
  • 对于后来查看此案例的任何人来说,这主要是由于标准的“async-things-do-not-happen-in-assumed-sequence”问题。阅读有关 ajax success callbacks 的背景信息。本质上,OP 试图访问尚未从服务器返回的数据。

标签: json model attributes sapui5


【解决方案1】:

我不建议使用模型的 getData() 方法,因为它已被弃用。

更好的解决方案是使用gConfigModel.getProperty("/Editable") (我在这里使用根斜线,因为您的属性位于模型的根目录中)

同样,你也可以设置你的数据: 改为gConfigModel.setProperty("/Editable", <your new value>)

【讨论】:

  • 这是我的第一个想法,但它不起作用。目前我在 oData 下面有另一个名为“d”的节点,我尝试像你说的那样访问 gConfigModel.getProperty("/d/Editable") 但它不起作用,我错过了什么吗?我还尝试了没有“d”-subnode 的旧模型,当我 console.log getProperty 方法时它也说未定义...... :(
  • 感谢访问帮助!从后端传输数据时,我错过了时间延迟!
【解决方案2】:

首先,感谢您为解决我们的问题所做的努力! (至少,那些关于它的东西.. :))

我找到了一个我认为更省钱的解决方案,因为超时可能有点随意 - 它取决于机器或要获取的数据量?

因此,我使用attachRequestCompleted 函数:

with sUrl_2="path-to-my-service";
var oModel_2 = new sap.ui.model.json.JSONModel(sUrl_2);

oModel_2.attachRequestCompleted(function(data) {

       //now, i can access the data stored in the oModel_2, either by getProperty, or by DOM: oModel_2.oData.d.Vendor

        gv_selLieferant = oModel_2.getProperty("/d/Vendor");
        gv_selEinkOrg = oModel_2.getProperty("/d/PurchOrg");
        gv_selEinKGru = oModel_2.getProperty("/d/PurGroup");

    });

【讨论】:

  • 这是最正确的答案。使用attachRequestCompleted 事件。唯一可以添加的是通过使用this 指针可以访问Odata 模型。
【解决方案3】:

<script src="https://openui5.hana.ondemand.com/resources/sap-ui-core.js" id="sap-ui-bootstrap" data-sap-ui-theme="sap_bluecrystal" data-sap-ui-libs="sap.m"></script>

<script>
    function getConfiguration(callback) {

        var sServiceUrl = "/sap/opu/odata/sap/xxx/ConfigurationSet('Initialize')";

        var config = {};

        var data = {
            "d": {
                "_metadata": "",
                "Backup01": "01",
                "Editable": "True"
            }
        };

        setTimeout((function() {
            config = data;
            callback(config);
        })(), 2000);
    };
    var gConfigModel = new sap.ui.model.json.JSONModel();

    var getConfigCallback = function(config) {
        gConfigModel.setData(config);
        alert(gConfigModel.getProperty("/d/Editable"));
    };

    getConfiguration(getConfigCallback);
</script>

【讨论】:

  • 问题是,我不能像你一样访问“var data”,因为它是在我的回调函数中设置的。它在 var getConfigCallback 期间设置为我的模型,但在我的代码中似乎无法访问它......我不明白......
  • 嗨 zyrex,我使用 setTimeout 模拟您的回调,它正在工作。
  • 这是否意味着我只能在函数(配置)期间访问我的属性?我的意图是接收 json,并将这个单个值存储在一个全局变量中,以便在我的主视图中随处访问它..
  • 你再一次给了我正确的提示,问题是我从 sap 后端获取数据并且不尊重它可能花费的时间。所以代码继续前进,当我等待 5 秒之前,例如getProperty,然后它就在那里!!!但我以为回调函数正是为我做的,等待一个函数完成??谢谢艾伦,神一样的。明确的。
猜你喜欢
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 2012-12-04
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多