Уважаемые эксперты по UI5!
Я столкнулся с проблемой переплета с моделью OData v4.У меня есть простая OData-структура с персонами, назначаемыми отделу, см. Выдержку из metadata.xml:
...
<EntityType Name="Person">
<Key>
<PropertyRef Name="Id"/>
</Key>
<Property Name="Id" Type="Edm.Int64"/>
<Property Name="FirstName" Type="Edm.String"/>
<Property Name="LastName" Type="Edm.String"/>
<Property Name="Email" Type="Edm.String"/>
<Property Name="Mobile" Type="Edm.String"/>
<Property Name="Username" Type="Edm.String"/>
<NavigationProperty Name="Department" Type="OData.WTS.Department" Partner="Person"/>
</EntityType>
<EntityType Name="Department">
<Key>
<PropertyRef Name="Id"/>
</Key>
<Property Name="Id" Type="Edm.Int64"/>
<Property Name="Name" Type="Edm.String"/>
<NavigationProperty Name="Person" Type="OData.WTS.Person" Partner="Department"/>
</EntityType>
...
Теперь я хочу создать UI5-приложение, которое позволяет пользователям создавать новых людей, которые должны быть назначеныв отдел (который должен быть выбран через ValueHelp).Поэтому я создал страницу списка, элементы которой привязаны к модели:
<Table items="{ path: 'userService>/Persons', parameters : {$expand: 'Department'} }">
...
</Table>
Сам отдел связан в виде XML:
...
<form:FormElement>
<form:label>
<Label text="{i18n>User.Department}"/>
</form:label>
<form:fields>
<Input id="Department"
name="{userService>Department/Id}"
value="{userService>Department/Name}"
showValueHelp="true" valueHelpOnly="true"
valueHelpRequest="onValueHelpRequestDepartment" />
</form:fields>
</form:FormElement>
...
Когда пользователь нажимает накнопку «Новый человек», я создаю новую запись модели переходного процесса через OData v4 ListBindingContext:
oListBindingContext
.create({
Id: null,
Username: "",
FirstName: "",
LastName: "",
Email: "",
Mobile: "",
Department: {
Id : null,
Name : null
}
}, function (oError) {
// handle error
}
);
Когда пользователь теперь выбирает отдел с помощью ValueHelp, я хочу назначить его Id и назовите недавносоздан Идентификатор и Имя отдела.Я пытаюсь сделать это через setter-функции Input-control, поскольку свойства привязаны к отделу:
// this should update the model-value
var oInput = this.getView().byId("Department");
oInput.setName(sSelectedId);
oInput.setValue(oSelectedBindingContext.getProperty("Name"));
Но это приводит к исключению:
Failed to update path /Persons/-1/Department/Name - Error: /Persons/-1/Department/Name: No key predicate known at /Persons/-1/Department
at error (http://localhost/ui5resources/sap/ui/model/odata/v4/ODataMetaModel-dbg.js?eval:1189:10)
at eval (http://localhost/ui5resources/sap/ui/model/odata/v4/ODataMetaModel-dbg.js?eval:1297:7)
at new SyncPromise (http://localhost/ui5resources/sap/ui/model/odata/v4/lib/_SyncPromise-dbg.js?eval:72:15)
at SyncPromise.then (http://localhost/ui5resources/sap/ui/model/odata/v4/lib/_SyncPromise-dbg.js?eval:151:12)
at eval (http://localhost/ui5resources/sap/ui/model/odata/v4/ODataMetaModel-dbg.js?eval:1288:47)
Делаете ли выесть какие-либо советы, как реализовать этот простой сценарий с OData v4?Я неправильно понимаю концепцию OData v4 здесь?Я использую OpenUI5 версии 1.50.6.
Заранее спасибо :-) Mirco