@openui5/sap.ui.core
Version:
OpenUI5 Core Library sap.ui.core
154 lines (144 loc) • 5.2 kB
JavaScript
/*!
* OpenUI5
* (c) Copyright 2026 SAP SE or an SAP affiliate company.
* Licensed under the Apache License, Version 2.0 - see LICENSE.txt.
*/
/*eslint-disable max-len */
// Provides the JSON model implementation of a list binding
sap.ui.define([
"sap/base/strings/hash",
"sap/base/util/deepEqual",
"sap/base/util/deepExtend",
"sap/base/util/each",
"sap/ui/model/ChangeReason",
"sap/ui/model/ClientListBinding"
], function(hash, deepEqual, deepExtend, each, ChangeReason, ClientListBinding) {
"use strict";
/**
*
* @class
* List binding implementation for Messages
*
* @param {sap.ui.model.message.MessageModel} oModel
* @param {string} sPath
* @param {sap.ui.model.Context} oContext
* @param {sap.ui.model.Sorter[]|sap.ui.model.Sorter} [aSorters=[]]
* The sorters used initially; call {@link #sort} to replace them
* @param {sap.ui.model.Filter[]|sap.ui.model.Filter} [aFilters=[]]
* The filters to be used initially with type {@link sap.ui.model.FilterType.Application}; call {@link #filter} to
* replace them
* @param {object} [mParameters]
* @throws {Error} If one of the filters uses an operator that is not supported by the underlying model
* implementation or if the {@link sap.ui.model.Filter.NONE} filter instance is contained in <code>aFilters</code>
* together with other filters
* @alias sap.ui.model.message.MessageListBinding
* @extends sap.ui.model.ClientListBinding
*/
var MessageListBinding = ClientListBinding.extend("sap.ui.model.message.MessageListBinding");
/*
* Define the symbol function when extended change detection is enabled.
* @override
*/
MessageListBinding.prototype.enableExtendedChangeDetection = function() {
ClientListBinding.prototype.enableExtendedChangeDetection.apply(this, arguments);
this.oExtendedChangeDetectionConfig = this.oExtendedChangeDetectionConfig || {};
this.oExtendedChangeDetectionConfig.symbol = function (vContext) {
if (typeof vContext !== "string") {
return this.getContextData(vContext); // objects require JSON string representation
}
return hash(vContext); // string use hash codes
}.bind(this);
};
/**
* Treats the context's object as sap/ui/core/message/Message.
* Its processor is removed, it is serialized and then the processor is re-added.
* This is required to avoid circular references when using <code>JSON.stringify</code>
* Note: The processor is not required for diff comparison.
*
* @private
* @param {sap.ui.model.Context} oContext object which is used for serialization.
* @returns {string} string representation of the context's object.
*/
MessageListBinding.prototype.getEntryData = function(oContext) {
var oObject = oContext.getObject();
// remove processor, serialize and re-add processor
// because processor contains a circular dependency and is not required for serialization
var oProcessor = oObject.processor;
delete oObject.processor;
var sJsonResult = JSON.stringify(oObject);
oObject.processor = oProcessor;
return sJsonResult;
};
/**
* Update the list, indices array and apply sorting and filtering.
* @private
*/
MessageListBinding.prototype.update = function(){
var oList = this.oModel._getObject(this.sPath, this.oContext);
if (Array.isArray(oList)) {
if (this.bUseExtendedChangeDetection) {
this.oList = deepExtend([], oList);
} else {
this.oList = oList.slice(0);
}
this.updateIndices();
this.applyFilter();
this.applySort();
this.iLength = this._getLength();
} else {
this.oList = [];
this.aIndices = [];
this.iLength = 0;
}
};
/**
* Check whether this Binding would provide new values and in case it changed,
* inform interested parties about this.
*
* @param {boolean} [bForceupdate]
* Whether interested parties should be informed regardless of the bindings state
*
*/
MessageListBinding.prototype.checkUpdate = function(bForceupdate){
var oList;
if (this.bSuspended && !this.bIgnoreSuspend) {
return;
}
if (!this.bUseExtendedChangeDetection) {
oList = this.oModel._getObject(this.sPath, this.oContext);
if (!deepEqual(this.oList, oList) || bForceupdate) {
this.update();
this._fireChange({reason: ChangeReason.Change});
}
} else {
var bChangeDetected = false;
var that = this;
//If the list has changed we need to update the indices first.
oList = this.oModel._getObject(this.sPath, this.oContext);
if (!deepEqual(this.oList, oList)) {
this.update();
}
//Get contexts for visible area and compare with stored contexts.
var aContexts = this._getContexts(this.iLastStartIndex, this.iLastLength);
if (this.aLastContexts) {
if (this.aLastContexts.length != aContexts.length) {
bChangeDetected = true;
} else {
each(this.aLastContextData, function(iIndex, oLastData) {
if (that.getContextData(aContexts[iIndex]) !== oLastData) {
bChangeDetected = true;
return false;
}
return true;
});
}
} else {
bChangeDetected = true;
}
if (bChangeDetected || bForceupdate) {
this._fireChange({reason: ChangeReason.Change});
}
}
};
return MessageListBinding;
});