我尝试使用相同的SimpleForm来创建新对象和进行编辑。我试着这样做:
<Input value="{= !${/isNew} ? ${som>Id} : ${newModel>Id}" />
但绑定不是在TwoWay模式下。是否有可能进入TwoWay Binding?
答案 0 :(得分:0)
我不太确定,如果在值中使用表达式绑定是正确的方法,但是应该在没有额外编码的情况下使用JSON模型(除了data-sap-ui-bindingsyntax =&#34; complex&#34) ;在你的ui5-bootstrap中)
使用OData模型,您需要使用oModel.setDefaultBindingMode(&#34; TwoWay&#34;) 如Setting the Default Binding Mode中所述,因为OData模型使用OneWay绑定作为默认值。
答案 1 :(得分:0)
在属性绑定中,使用...
parts
与formatter
...将绑定模式转换为 OneWay (如果在表达式绑定中为{:=
,则甚至 OneTime )。他们都使用模块CompositeBinding,可以通过以下方式观察:
myInput.getBinding("value").getMetadata().getName() // "sap.ui.model.CompositeBinding"
大多数属性绑定 因此,CompositeBinding是 OneWay 。
解决方案:除了type
之外,如果分配了parts
,则属性绑定可以变为 TwoWay 。相应的类型应该是从抽象模块CompositeType派生的类型(例如Currency)。
请参阅:https://embed.plnkr.co/0MVvfZ/?show=view%2FHome.view.xml,preview
在我们的例子中,我们可以创建一个复合类型,它需要三元运算所需的全部三个parts
;一个用于条件,一个用于 truthy 案例(a
),另一个用于 falsy 案例(b
):
<Input value="{
parts: [
'/condition',
'a>/value',
'b>/value'
],
type: 'demo.model.type.Ternary'
}" />
实际的三元操作发生在类型定义中,可能如下所示:
sap.ui.define([
"sap/ui/model/CompositeType"
], function(CompositeType) {
"use strict";
return CompositeType.extend("demo.model.type.Ternary", {
constructor: function() {
CompositeType.apply(this, arguments);
this.bParseWithValues = true; // make 'parts' available in parseValue
},
/**
* Displaying data from the right model (model -> view)
*/
formatValue: parts => parts[0] ? parts[1] : parts[2],
/**
* Assigning entered value to the right model (view -> model)
*/
parseValue: (enteredValue, stuff, parts) => parts[0] ? [
parts[0],
enteredValue,
parts[2],
] : [
parts[0],
parts[1],
enteredValue,
],
validateValue: () => true // Nothing to validate here
});
});
确保all binding parts
启用了TwoWay模式:
请注意,当其中一个绑定部件未处于TwoWay模式时,复合绑定将被强制进入OneWay模式。
compatVersion="edge"
(或bindingSyntax="complex"
)。答案 2 :(得分:0)
还有另一种方法可以解决此问题。利用Input控件上的任何事件(例如:submit)。
查看:
<Input value="{= !${/isNew} ? ${som>Id} : ${newModel>Id}" submit="onSubmitValue"/>
控制器:
onSubmitValue:function(oEvent){
var value=oEvent.getSource().getValue();
var sPath=oEvent.getSource().getBindingContext('YourModelName').getPath();
this.getView().getModel('YourModelName').setProperty(sPath+'/PropertyName',value);
}