2017-01-19 4 views
0

Я застрял в том, возможно ли понятие в SAPUI5, и поскольку документы могут быть немного трудными для работы на этом уровне детализации, я задаю этот вопрос ранее в мой путь исследования, чем обычно. В основном я не хочу тратить слишком много времени, если есть немедленный ответ «Нет».Можно ли использовать 2 модели в одном представлении

У меня есть использование случай зрения, что является мастер-деталь, используя модель JSON, но я должен производить свои собственные элементы управления - я не могу использовать SplitApp и т.д.

Модель эффективно 2-слойное глубокое дерево, ведущее к деталям. Концептуально, как это:

{ 
    "master": [ 
     { 
      "name": "Master 1", 
      "detail" : [ 
       { 
       "name": "Detail 1-1" 
       }, 
       { 
       "name": "Detail 1-2" 
       } 
      ] 
     }, 
     { 
      "name": "Master 2", 
      "detail" : [ 
       { 
       "name": "Detail 2-1" 
       }, 
       { 
       "name": "Detail 2-2" 
       } 
      ] 
     } 
    ] 
} 

УБ является то, что будет выбирать список мастеров и когда выбор сделан контрольный список деталей будет обновляться, чтобы показать детали, которые являются потомками выбранного мастера.

Я знаком с привязкой модель к представлению с помощью

sap.ui.getCore().setModel(oModel) 
this.getView().setModel(oModel) 

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

варианты я думаю, может быть стоит следовать являются:

  1. Bind отдельная модель для каждого из элементов управления главной и подчиненной и писать собственный код, чтобы перейти из детальной-модели при выборе мастера. Но как сделать такие привязки;
  2. Используйте одну модель, но каким-то образом установите элемент управления деталями, чтобы распознать мастер текущего выбора.
  3. Используйте какой-то фильтр для управления деталями.

Объясняя 2 далее, если сказать, что я использовал таблицу для отображения подробно я мог бы иметь в таблице Защиту

<Table 
      id="detailList" 
      items="{ 
       path: '/' 
      }", 
      ... 
    > 

Так что я смотрел бы, чтобы изменить путь к чему-то вроде

path: '/master[n]/detail/' 

где n представляет выбранный основной экземпляр.

Возможно, или есть другая альтернатива, или я должен отказаться.

EDIT: Я нашел это потенциальное решение на основе фильтра на Michael Herzog here. Его описание:

я дам вам пример, как можно реализовать отношения matser-деталь в SAPUI5.

Использование: когда пользователь нажимает на клиента в первой таблице, все соответствующие заказы должны отображаться во второй таблице. Заказы от других клиентов должны быть скрыты.

Таким образом, по нашему мнению, у нас есть две таблицы:

  1. Таблица: Клиенты

  2. Таблица: Заказы

После создания обеих таблиц и настроить привязку данных , осуществить этот обработчик событий на первом столе:

oTableClients.attachRowSelectionChange(function(oEvent){ 

    // first, we fetch the binding context of the selected row 
    var selectedRowContext = oEvent.getParameter("rowContext"); 
    // get the ID of the customer via rowContext. The model-object represents the data of the first table 
    var selectedClientId = oModel,getProperty("id", selectedRowContext); 
    // get binding of second table 
    var ordersBinding = oTableOrders.getBinding(); 
    //create new filter to show the relevant data for the selected customer 
    var oFilter = new sap.ui.model.Filter("clientId", sap.ui.model.FilterOperation.EQ, selectedClientId); 
    // apply filter to binding 
    ordersBinding.filter([oFilter]); 
}); 

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

ответ

4

В общем, ваш взгляд может иметь столько моделей, которые вам нравятся. Единственное ограничение состоит в том, что может быть только одна безымянная модель, т. Е. Все остальные модели должны быть названы. Следующий код показывает разницу:

this.getView().setModel(new JSONModel(data)); 
this.getView().setModel(new JSONModel(data), name)); 

Чтобы связать против имени модели, вы должны предоставить свое имя в связывающей инструкции, в противном случае среда выполнение использует безымянную модель. Следующий пример показывает разницу (обратите внимание, что вы можете использовать короткий обязательный синтаксис, если вы не хотите, чтобы указать дополнительные параметры, то есть вы можете опустить path атрибут:

<Table items="{/path}"> 
<Table items="{name>/path}"> 

В вашем примере я хотел бы предложить, чтобы работать с одной моделью и использовать контекст привязки для управления данными, приведенных в таблице подробно

связывание таблицы деталей должна быть относительными и выглядеть следующий образом:.

<Table id="detailList" items="{detail}"> 

обработчик для обработки выбора мастер-л ist следующим образом:

onMasterItemSelect : function(event) { 
    // get the binding context of the currently selected master item, e.g. /master/0 
    var masterBindingContext = event.getParameter("listItem").getBindingContext(); 

    // bind detail table to the selected master item using bindElement 
    this.byId("details").bindElement(masterBindingContext.getPath()); 
} 
+0

Thanks Matbtt - Я буду работать над этим и отчитываться. И спасибо за примеры setModel() - полезное напоминание и полезно для будущих посетителей. –

+0

OK - применил подход в вашем ответе, и он хорошо работает. Я сделал одно изменение, которое должно было включать сортировку в определение привязки деталей, чтобы оно выглядело так: 'items =" {path: 'detail', sortter: {path: 'name'}} "'. Это нужно, чтобы отсортировать данные по атрибуту 'name'. Не упоминается как вопрос в исходном вопросе, но полезно отметить формат. –