Передача данных с главной страницы на страницу сведений



Я посмотрел несколько руководств по навигации + передаче данных между представлениями, но в моем случае это не работает.
Моя цель состоит в том, чтобы достичь следующего:




  1. на главной странице пользователь может видеть таблицу с продуктами (JSON-файл). (Работает отлично!)

  2. после нажатия кнопки "подробности"отображается страница сведений ("форма") со всей информацией о выборе.


Навигация работает отлично, и страница сведений отображается, однако привязка данных, похоже, не работает. работа (данные не отображаются)
Моя идея состоит в том, чтобы передать строку JSON на страницу сведений. Как я могу этого достичь? Или есть более элегантный способ?



Вот код до сих пор:



Контроллер MainView



sap.ui.controller("my.zodb_demo.MainView", {

onInit: function() {
var oModel = new sap.ui.model.json.JSONModel("zodb_demo/model/products.json");

var mainTable = this.getView().byId("productsTable");
this.getView().setModel(oModel);
mainTable.setModel(oModel);
mainTable.bindItems("/ProductCollection", new sap.m.ColumnListItem({
cells: [new sap.m.Text({
text: "{Name}"
}), new sap.m.Text({
text: "{SupplierName}"
}), new sap.m.Text({
text: "{Price}"
})]
}));
},

onDetailsPressed: function(oEvent) {
var oTable = this.getView().byId("productsTable");

var contexts = oTable.getSelectedContexts();
var items = contexts.map(function(c) {
return c.getObject();
});

var app = sap.ui.getCore().byId("mainApp");
var page = app.getPage("DetailsForm");

//Just to check if the selected JSON String is correct
alert(JSON.stringify(items));


//Navigation to the Detail Form
app.to(page, "flip");
}
});


Детальный Вид Формы:



<mvc:View xmlns:core="sap.ui.core" xmlns="sap.m" xmlns:f="sap.ui.layout.form" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:mvc="sap.ui.core.mvc" controllerName="my.zodb_demo.DetailsForm">
<Page title="Details" showNavButton="true" navButtonPress="goBack">
<content>
<f:Form id="FormMain" minWidth="1024" maxContainerCols="2" editable="false" class="isReadonly">
<f:title>
<core:Title text="Information" />
</f:title>
<f:layout>
<f:ResponsiveGridLayout labelSpanL="3" labelSpanM="3" emptySpanL="4" emptySpanM="4" columnsL="1" columnsM="1" />
</f:layout>
<f:formContainers>
<f:FormContainer>
<f:formElements>
<f:FormElement label="Supplier Name">
<f:fields>
<Text text="{SupplierName}" id="nameText" />
</f:fields>
</f:FormElement>
<f:FormElement label="Product">
<f:fields>
<Text text="{Name}" />
</f:fields>
</f:FormElement>
</f:formElements>
</f:FormContainer>
</f:formContainers>
</f:Form>
</content>
</Page>
</mvc:View>


Контроллер Формы Деталей:



sap.ui.controller("my.zodb_demo.DetailsForm", {

goBack: function() {
var app = sap.ui.getCore().byId("mainApp");
app.back();
}
});
370   3  

3 ответов:

Рекомендуемый способ передачи данных между контроллерами-использовать EventBus

sap.ui.getCore().getEventBus();

Вы определяете канал и событие между контроллерами. На вашем DetailController вы подписываетесь на событие, подобное этому:

onInit : function() {
    var eventBus = sap.ui.getCore().getEventBus();
    // 1. ChannelName, 2. EventName, 3. Function to be executed, 4. Listener
    eventBus.subscribe("MainDetailChannel", "onNavigateEvent", this.onDataReceived, this);)
},

onDataReceived : function(channel, event, data) {
   // do something with the data (bind to model)
   console.log(JSON.stringify(data));
}

И на вашем главном контроллере вы публикуете событие:

...
//Navigation to the Detail Form
app.to(page,"flip");
var eventBus = sap.ui.getCore().getEventBus();
// 1. ChannelName, 2. EventName, 3. the data
eventBus.publish("MainDetailChannel", "onNavigateEvent", { foo : "bar" });
...

Смотрите документацию здесь: https://openui5.hana.ondemand.com/docs/api/symbols/sap.ui.core.EventBus.html#subscribe

И более подробный образец: http://scn.sap.com/community/developer-center/front-end/blog/2015/10/25/openui5-sapui5-communication-between-controllers--using-publish-and-subscribe-from-eventbus

Несмотря на то, что этот вопрос устарел, сценарий все еще действителен сегодня (это типичный сценарий master-detail / n-to-1). С другой стороны, принятое в настоящее время решение не только устарело, но и является результатомXY-задачи .

Есть ли более элегантный способ?

Безусловно. Взгляните на этот пример: https://embed.plnkr.co/F3t6gI8TPUZwCOnA?show=preview

Независимо от того, какой элемент управления используется (App, SplitApp или FlexibleColumnLayout), концепция та же:

  1. пользователь нажимает на элемент из Мастера.
    1. получить контекст привязки из выбранного элемента с помощью getBindingContext(/*modelName*/)
    2. передать только ключ(Ы) В navTo параметры (нет необходимости передавать весь контекст элемента)
  2. в подробном виде
    1. прикрепить обработчик к patternMatched событие пройденного маршрута в onInit
    2. в обработчике создайте соответствующий ключ, с помощью которого целевую запись можно однозначно идентифицировать, обратившись к параметру события arguments, в котором хранятся передаваемые ключи. в случае OData используйте API createKey.
    3. с помощью созданного ключа вызовите bindElement с помощью пути к уникальной записи, чтобы распространить ее контекст на детальное представление.
  3. относительные пути привязки в детальном представлении могут быть затем разрешены каждый раз при просмотре страницы детализации (поддержка глубоких ссылок).

Можно также задать локальную модель json для хранения данных и использовать ее в соответствующих представлениях. Но обязательно инициализируйте или очистите его в нужное время.

Comments

    Ничего не найдено.