2014-10-10 4 views
2

В настоящее время я пытаюсь понять, как я могу получить одно значение из sap.ui.model.json.JSONModelSAPUI5 получить одно свойство из JSON-модели

в моем главном экране:

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 в одной переменной.

console.log-statement

Я уже пробовал gConfigModel.getProperty ('/'), не работал. пытался получить доступ к gConfigModel.oData был не определен. Как сохранить его в одном значении?

Решение Комментарий: Если вы поймаете данные из бэкэнд, вам нужно позаботиться о том, сколько времени потребуется. данные могут быть доступны позже, чем ожидалось, в моем случае я добавил 1s таймаут, после этого я могу получить доступ к свойству легко

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

GetData() должен возвращать объект OData. Поэтому для доступа к Editable просто используйте var editable = gConfigModel.getData(). Editable; – user2808624

+0

Метод getData() возвращает объект, у которого нет узлов или атрибутов ниже .. :(Что мне не хватает? – zyrex

+0

Для тех, кто заглянул в этот случай позже, это было связано прежде всего с стандартным «async-things-do- not-happen-in-предполагаемая последовательность ". Читайте о' ajax success callbacks' для фона. По сути, OP пытался получить доступ к данным, которые еще не были возвращены с сервера. –

ответ

1

<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>

+0

Дело в том, что я не могу получить доступ к данным «var data», как вы, потому что он установлен во время моей функции обратного вызова. он установлен на мою модель во время var getConfigCallback, но кажется, что это не доступно позже в моем коде ... Я не понимаю. – zyrex

+0

hi zyrex, я смоделирую ваш обратный вызов с помощью setTimeout, он работает. – Allen

+0

это означает, что я могу получить доступ только к моей собственности во время функции (config)? я хочу получить json и сохранить это единственное значение в глобальной переменной, чтобы получить доступ к нему повсюду в моем главном представлении. – zyrex

4

Я бы не советовал использовать getData() метод в модели, так как он является устаревшим.

Гораздо лучшим решением является использование gConfigModel.getProperty("/Editable") (я использую корень слэш здесь, так как ваша собственность находится в корневом каталоге вашей модели)

Таким же образом, вы также можете установить данные: gConfigModel.setProperty("/Editable", <your new value>) вместо

+0

это была моя первая мысль, но она не работает в настоящее время у меня есть другой узел ниже oData, называемый «d», я пытаюсь получить доступ, как вы сказали gConfigModel.getProperty («/ d/Editable»), но это не работает, я что-то пропустил? Я также попробовал свою старую модель без " d "-subnode, он также говорит undefined, когда я console.log метод getProperty ... :( – zyrex

+0

спасибо за помощь в доступе! Я пропустил уважение к задержке при передаче данных из бэкэнда! – zyrex

1

Прежде всего, спасибо за усилия, чтобы найти решение наших проблем! (по крайней мере, те, которые касаются этого материала .. :))

Я нашел решение, которое, я думаю, немного больше сэкономит, потому что тайм-аут может быть несколько произвольным - это будет зависеть от машины или количества данные, которые должны быть получены?

Поэтому я использую 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"); 

    }); 
+0

Я получил его от: https://scn.sap.com/thread/3765318 –

+1

Это самый правильный ответ. Использование события 'attachRequestCompleted'. Единственное, что можно добавить, это то, что с помощью указателя 'this' вы можете добраться до модели Odata. –

Смежные вопросы