2016-12-02 1 views
-1

я определил модель по умолчанию в manifest.json:Как получить единственный объект JSON в модели JSON?

"dataSources": {    
     "mainService": { 
      "uri": "/.../vehicleCollection", 
      "type": "JSON" 
     } 
    }, 

Тогда получить sap.ui.model.json.JSONModel по:

var model = oView.getModel();  
var oObject = model.getJSON("/VEHICLES(0001)"); 

То, что я хочу, это транспортные средства, которые vehicleId является 0001 вместо этого он вернулся весь массив транспортных средств в строке:

oObject = "{"VEHICLES":[{"vehicleId":"0001","route":...} {"vehicleId":"0005","route":...} ..."

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

Ссылка: https://sapui5.netweaver.ondemand.com/#docs/api/symbols/sap.ui.model.json.JSONModel.html

==== Обновление ====

JSON-структура (результат model.oData данные и получить от "/.../vehicleCollection",):

{"VEHICLES":[ { "vehicleId":"0001", "route":"..", ... }, { "vehicleId":"0005", "route: "..", ... }] }

=== = update =====

Я хотел бы поделиться своим обходным путем (это ОК, чтобы поместить их сюда?), Я признаю, что это очень уродливо, поэтому я надеюсь сделать его более элегантным, используя API UI5.

Master.controller.js

_showDetail : function (oItem) { var bReplace = !Device.system.phone; this.getRouter().navTo("object", { objectId : oItem.getBindingContext().getProperty("vehicleId") }, bReplace); },

Detail.controller.js

_onBindingChange : function() { 
var oView = this.getView(), 
    oElementBinding = oView.getElementBinding(), 
    oViewModel = this.getModel("detailView"), 
    sPath = oElementBinding.getPath(), 
    oResourceBundle = this.getResourceBundle(), 
    ObjectId = sPath.match(/'(.*?)'/)[1], 

var JSONObject = oView.getModel().getJSON(); 

JSONObject = JSON.parse(JSONObject); 

function getObjects(obj, key, val) { 
    var objects = []; 
    for (var i in obj) { 
     if (!obj.hasOwnProperty(i)) continue; 
     if (typeof obj[i] == 'object') { 
      objects = objects.concat(getObjects(obj[i], key, val)); 
     } else if (i == key && obj[key] == val) { 
      objects.push(obj); 
     } 
    } 
    return objects; 
} 

var oneVehicle = getObjects(JSONObject, "vehicleId", ObjectId); 

oViewModel.setProperty("/route", oneVehicle[0]['route']); 
}, 

Detail.view.xml

<ObjectStatus text="{detailView>/route}"/> 
+0

Вы можете попробовать: 'вар OData = model.getProperty ("/ АВТОМОБИЛИ (0001)") .getObject(); console.log (oData); ' –

+0

@Rahul Bhardwaj' model.getProperty ("/ VEHICLES (0001)") 'возвращено undefined – Tina

+1

Можете ли вы вставить свой автомобильCollection и' console.log (model.getData()) '? –

ответ

3

Предлагаемое решение работает, но оно не охватывает лучшие практики, и я настоятельно рекомендую не начинать код таким образом. Вы всегда должны использовать getProperty для доступа к данным модели.В вашем примере вы получаете доступ vehicleId так:

var vehicleId = model.getProperty("/VEHICLES/3/vehicleId"); 

Если вам нужно все использовать транспортное средство:

var vehicle = model.getProperty("/VEHICLES/3"); 
+0

Ваш ответ не получает объект транспортного средства на основе транспортного средства, но на основании позиции в списке. Это верно ? Может быть, какой-то запрос xpath будет работать /vehicles/[vehicleId.=0001], может быть? –

+0

да, @VanquishedWombat Это именно то, что я хотел! потому что приложение является страницей мастер-детали, я обнаружил, что шаблон на странице подробностей не работает, я знаю, что на объекте, который щелкнул на главной странице, я знаю, но не уверен, что смогу получить позицию. – Tina

+0

@Tina Чтобы проверить - вы делаете это, чтобы получить доступ к выбранным деталям автомобиля в контроллере подробного просмотра? Если нет необходимости «искать» транспортное средство на основе идентификатора, вместо этого получить контекст привязки из представления, который является дескриптором транспортного средства, и вы можете получить доступ ко всем атрибутам через getProperty(). Меня заинтересовал подобный req из-за некоторой ленивой загрузки, которую я должен был сделать для отложенных подробных данных. Мое дело было для проектов> задач> журналов времени, а проект как мастер и задача как детали, а затем, когда была выбрана задача, мне пришлось загружать данные журнала времени DB на вкладку, поэтому мне нужен ключ задачи. –

1

model.getData() поможет вам объект. И как только вы получите объект, вы можете использовать ключ, то есть model.getData().VEHICLES, который даст вам значение, которое теперь является массивом для доступа к третьему элементу model.getData().VEHICLES[3].

Таким образом, ваш ответ будет:

model.getData().VEHICLES[3].vehicleId ; 

Примечание: Это некоторые предположения о вашей JSON, но если можно сделать console.log (model.getData()) или место JSON. stringify (model.getData()) вставьте свою структуру json в вопрос и сообщите нам, какой конкретный элемент вы хотите получить к нему, было бы легко.

+1

Если кто-то подал ответ, пожалуйста, позаботьтесь о том, почему. – SiddP

+0

Пожалуйста, прочтите мой ответ ниже. – matbtt

+0

@matbtt ok upvote для вас, но я не думаю, что мое решение заслуживает нисходящего движения, хотя :). А также, если бы вы могли добавить, насколько эффективнее ваш ответ, было бы здорово. – SiddP

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