具有双向绑定模式的CompositeBinding

时间:2018-03-19 16:15:02

标签: sapui5

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

<Input value="{= !${/isNew} ? ${som>Id} : ${newModel>Id}" />

但绑定不是在TwoWay模式下。是否有可能进入TwoWay Binding?

3 个答案:

答案 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)

在属性绑定中,使用...

...将绑定模式转换为 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模式。

  • 为了首先启用CompositeBinding,必须在bootstrap configuration中提供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);
}