Свойство модели, рассматриваемое как объект вместо строки в formatOptions

#sapui5

#sapui5

Вопрос:

У меня есть фрагмент, содержащий метки и входные компоненты. Его значения в основном устанавливаются статически, и он работает так, как ожидалось:

 <Label text="Customer" />
<Input
  value="John Smith"
  editable="true"
  change=".liveChangeVehicleGrossPrice"
/>
<Label text="Price" />
<Input
  editable="true"
  change=".liveChangeVehicleGrossPrice"
  value="{
    parts: [
      'P02_Model>/VehicleGrossPrice',
      'valuta>/convert'
    ],
    type: 'sap.ui.model.type.Currency',
    formatOptions: {
      showMeasure: false
    }
  }"
/>
  

Теперь я создал в контроллере модель, содержащую значения, которые будут использоваться во входных компонентах: одно значение (клиент), которое будет добавлено в поле имени клиента, и два свойства ( groupingSeparator и decimalSeparator ) для форматирования валюты:

 var json = {
  "groupingSeparator": " ",
  "decimalSeparator": ",",
  "customer": "John Wayne",
};
var model = new JSONModel(json);
this.getView().setModel(model, "P02_Model");
  

После создания этой модели я изменяю фрагмент, чтобы использовать эти значения:

 <Label text="Customer" />
<Input
  editable="true"
  change=".liveChangeVehicleGrossPrice"
  value="{P02_Model>/customer}"
/>
<Label text="Price" />
<Input
  editable="true"
  change=".liveChangeVehicleGrossPrice"
  value="{
    parts: [
      'P02_Model>/VehicleGrossPrice',
      'valuta>/convert'
    ],
    type: 'sap.ui.model.type.Currency',
    formatOptions: {
      showMeasure: false,
      groupingSeparator: {P02_Model>/groupingSeparator},
      decimalSeparator: {P02_Model>/decimalSeparator}
    }
  }"
/>
  

Проблема в том, что при загрузке страницы имя John Wayne правильно отображается в соответствующем вводе, но ввод, содержащий валюту, будет иметь

112[Объект object]323[Объект object]2

вместо 112 323,2 .

Каким-то образом два значения, связанные с groupingSeparator и decimalSeparator , которые являются строками, обрабатываются как объекты. ПОЧЕМУ?

Комментарии:

1. Я не думаю, что вы можете задавать значения для groupingSeparator с помощью привязки. Это должно быть статическое значение. Могут быть привязаны только свойства элемента управления UI5.

Ответ №1:

ПОЧЕМУ?

Это потому, что объекты binding info не являются managedObject, а простым объектом, который не поддерживает возможности привязки. Вам придется сделать это в JS.

 <Input id="myInput" />
  
 onInit: function() {
  // ...    
  const model = this.getView().getModel("P02_Model");
  this.byId("myInput").bindValue({
    parts: [
      "P02_Model>/VehicleGrossPrice",
      "valuta>/convert"
    ],
    type: this.createCurrencyType()
  });
},

onModelDataChanged: function() {
  this.byId("myInput").getBinding("value").setType(this.createCurrencyType());
},

createCurrencyType: function() {
  return new CurrencyType({ // required "sap/ui/model/type/Currency"
    groupingSeparator: model.getProperty("/groupingSeparator"),
    decimalSeparator: model.getProperty("/decimalSeparator")
  });
},