Уважаемые 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 и Name для вновь созданного идентификатора отдела Person и Name. Я пытаюсь сделать это с помощью функций-установщиков 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.
Заранее спасибо :-) Мирко





Либо вы передаете неверный ключ '-1' из пользовательского интерфейса, либо проверьте свой набор сущностей odata, если вы создали какой-либо атрибут в качестве ключа или нет?