Aeglasin
Aeglasin

Reputation: 165

Calling formatter with parts and static value doesn't work

Basically I want to use a formatter function to fill the 3 properties of an sap.m.ObjectStatus (text, state, icon) depending on some static value.

<m:ObjectStatus
  text="{
    parts: [
      { path: 'currentRoles>STATE_TEXT' },
      { path: 'currentRoles>STATE' },
      { path: 'currentRoles>REFERENCED_ENTRY/SV_RH_ROLE_ACTIVE' },
      { path: 'currentRoles>invalid' },
      { value: 'text' }
    ],
    formatter: '.formatter.Formatter.convertRoleStatus'
  }"
  ...
/>

The strange thing is; if I omit the value part in the XML, the function is called. If it's included, the function gets never called in the first place.

As of the one of the answers to the post Pass Static Value to Formatter Parameters in XML View, passing parameters with value should work if the UI5 version is higher than 1.61. We use 1.71.2.

At other places in code, this works.

How to fix this issue?

Upvotes: 1

Views: 3780

Answers (3)

Boghyon Hoffmann
Boghyon Hoffmann

Reputation: 18044

Update: The issue is fixed now with commit: 4a9cf89 which will be available in 1.80+.
Now static bindings can be used even without any workarounds like the one mentioned below.


Original answer (workaround):

The issue is now reported in https://github.com/SAP/openui5/issues/2916. Thanks for making us aware of it!

A quick "fix" (I'd say a monkey patch) is to add model: 'myExistingModel' to the static binding info:

parts: [
  { path: 'currentRoles>STATE_TEXT' },
  { path: 'currentRoles>STATE' },
  { path: 'currentRoles>REFERENCED_ENTRY/SV_RH_ROLE_ACTIVE' },
  { path: 'currentRoles>invalid' },
  { value: 'text', model: 'currentRoles' }
],

This fix actually doesn't make sense since static bindings don't have any models, but can be used until the official fix arrives without the need to refactor a lot.

Upvotes: 1

Aeglasin
Aeglasin

Reputation: 165

As for now, since changing the binding to a default one like Bernard propsed was not possible without heavy refactoring, I changed my formatter logic a bit in a way such as to create 3 seperat functions (with 4 parameters) that call the orginal convertRoleStatus function, each with different inputs for the fifth parameter, which is mode.
I will report the problem with SAP to hopfully resolve it someday.

Upvotes: 0

Bernard
Bernard

Reputation: 1238

I suspect there is a limitation (possibly a bug):

If you do not use a named model this works for me:

... ??="{ parts : [ {path: 'a'}, {path: 'b'}, {path: 'c'}, {path: 'd'}, {value: 23} ], formatter: '.myFormatter'}"

...

let model = new JSONModel(this.getData());
this.getView().setModel(model);

...

myFormatter: function (a, b, c, d, v) {
  console.log(a, b, c, d, v);
},
getData: function(){
  return {"testdata": [
    { a: 1, b: "stringB", c: "stringC", d: "stringD"},
    ]};
  }

console output: 1 "stringB" "stringC" "stringD" 23

The moment I name my model this stops working. For now, if possible, use the default model for your data - not ideal?!

Try (you may have to do some model name trading?!) after assigning the named model as the default (un-named) model:

parts: [
            {path: 'STATE_TEXT'},
            {path: 'STATE'},
            {path: 'REFERENCED_ENTRY/SV_RH_ROLE_ACTIVE'},
            {path: 'invalid'},
            {value: 'text'}
        ],

while this gets it to work you may want to raise this with the UI5 Team?

Upvotes: 1

Related Questions