I\'m using OpenUI5. Using the formatter.js
, I have formatted some text in my view.
But my formatter is called 3 times:
When I bind the
Set the model to the view only when the data request is completed:
onInit: function() {
const dataUri = sap.ui.require.toUri("/model/data.json");
const model = new JSONModel(dataUri);
model.attachEventOnce("requestCompleted", function() {
this.getView().setModel(model);
}, this);
// ...
},
This ensures that the formatter is called only once (invoked by checkUpdate(true)
which happens on binding initialization; see below), and no further changes are detected afterwards.
Additionally (or alternatively), make the formatter more defensive. Something like:
function(value1, value2) {
let result = "";
if (value1 && value2) {
// format accordingly ...
}
return result;
}
Why does this happen?
onInit
of the Controller gets invoked. Here, the file model/data.json
is requested (model is empty).checkUpdate(/*forceUpdate*/true)
src in each one of them.forceUpdate
flag activated, change
event is fired, which forcefully triggers the formatters even if there were no changes at all:[undefined, undefined]
→ [undefined, undefined]
. - 1st formatter callmodel/data.json
is now completed. Now the model needs to checkUpdate
again.[undefined, undefined]
→ [value1, undefined]
→ change detected → 2nd formatter call[value1, undefined]
→ [value1, value2]
→ change detected → 3rd formatter call