Sapui5 具有双向绑定模式的复合绑定

Sapui5 具有双向绑定模式的复合绑定,sapui5,Sapui5,我尝试使用相同的SimpleForm来创建新对象和进行编辑。我试着这样做: 但是绑定不是双向模式。是否有可能实现双向绑定?我不太确定,在值中使用表达式绑定是否是正确的方法,但应该在不进行额外编码的情况下使用JSON模型(ui5引导中的数据sap ui bindingsyntax=“complex”除外) 对于OData模型,您需要使用oModel.setDefaultBindingMode(“双向”) 如中所述,因为OData模型默认使用单向绑定。在属性绑定中,使用 表达式绑定 多个绑定

我尝试使用相同的SimpleForm来创建新对象和进行编辑。我试着这样做:



但是绑定不是双向模式。是否有可能实现双向绑定?

我不太确定,在值中使用表达式绑定是否是正确的方法,但应该在不进行额外编码的情况下使用JSON模型(ui5引导中的数据sap ui bindingsyntax=“complex”除外)

对于OData模型,您需要使用oModel.setDefaultBindingMode(“双向”)
如中所述,因为OData模型默认使用单向绑定。

在属性绑定中,使用

  • 表达式绑定
  • 多个绑定
    部分
    格式化程序
。。。将绑定模式转换为单向(或者在表达式绑定中的
{:=
情况下甚至是一次性)。它们都使用了模块,可以通过以下方式观察:

myInput.getBinding(“值”).getMetadata().getName()/“sap.ui.model.CompositeBinding”
大多数具有 因此,复合装订是单向的

解决方案:当除了
部分
之外还分配了
类型
时,属性绑定可以是双向的。然后,适当的类型应该是从抽象模块派生的类型(例如)

演示 见:

在我们的例子中,我们可以创建一个复合类型,它包含三元操作所需的所有三个部分:一个用于条件,一个用于真实情况(
a
),一个用于假情况(
b
):


实际的三元操作发生在类型定义中,它可能看起来像这样:

sap.ui.define([
“sap/ui/model/CompositeType”
],函数(复合类型){
“严格使用”;
返回CompositeType.extend(“demo.model.type.ternal”{
构造函数:函数(){
CompositeType.apply(这个,参数);
this.bParseWithValues=true;//使“parts”在parseValue中可用
},
/**
*显示来自右侧模型的数据(模型->视图)
*/
formatValue:parts=>parts[0]?parts[1]:parts[2],
/**
*将输入的值分配给正确的模型(视图->模型)
*/
parseValue:(输入的值,填充,部分)=>部分[0][
第[0]部分,
输入值,
第[2]部分:,
] : [
第[0]部分,
第[1]部分,
输入值,
],
validateValue:()=>true//此处没有要验证的内容
});
});

  • 确保已启用双向模式:

    请注意,当其中一个绑定部分未处于双向模式时,复合绑定将强制进入单向模式

  • 为了首先启用复合绑定,必须在中提供
    compativersion=“edge”
    (或
    bindingSyntax=“complex”


还有另一种方法可以做到这一点。利用输入控件上的任何事件(例如:提交)

查看:

<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);
}

我仍然将BindingMode设置为Twoway。简单的答案是否。这是不可能的。原因是UI5框架必须对逻辑进行反向工程以更新模型,这太复杂了。另一种解决方案是始终将其绑定到newModel>Id。对于编辑场景,编写代码以设置newModel>Id=som>Id。要扩展:不,这是不可能的使用表达式绑定。但是,当给定适当的
类型时,在CompositeBinding中仍然可以进行双向绑定。