@openui5/sap.ui.core
Version:
OpenUI5 Core Library sap.ui.core
185 lines (159 loc) • 5.24 kB
JavaScript
/*!
* OpenUI5
* (c) Copyright 2009-2021 SAP SE or an SAP affiliate company.
* Licensed under the Apache License, Version 2.0 - see LICENSE.txt.
*/
// Provides class sap.ui.model.odata.ODataPropertyBinding
sap.ui.define([
'sap/ui/model/Context',
'sap/ui/model/ChangeReason',
'sap/ui/model/PropertyBinding',
"sap/base/util/deepEqual",
'sap/ui/model/ChangeReason'
],
function(Context, ChangeReason, PropertyBinding, deepEqual) {
"use strict";
/**
* Do <strong>NOT</strong> call this private constructor, but rather use
* {@link sap.ui.model.odata.v2.ODataModel#bindProperty} instead!
* @class
* Property binding implementation for OData format
*
* @param {sap.ui.model.Model} oModel
* @param {string} sPath
* @param {sap.ui.model.Context} oContext
* @param {object} [mParameters]
*
* @public
* @alias sap.ui.model.odata.ODataPropertyBinding
* @extends sap.ui.model.PropertyBinding
*/
var ODataPropertyBinding = PropertyBinding.extend("sap.ui.model.odata.ODataPropertyBinding", /** @lends sap.ui.model.odata.ODataPropertyBinding.prototype */ {
constructor : function(oModel, sPath, oContext, mParameters){
PropertyBinding.apply(this, arguments);
this.bInitial = true;
this.oValue = this._getValue();
this.vOriginalValue;
this.getDataState().setValue(this.oValue);
this.setIgnoreMessages(mParameters && mParameters.ignoreMessages);
}
});
/**
* Initialize the binding. The message should be called when creating a binding.
* If metadata is not yet available, do nothing, method will be called again when
* metadata is loaded.
*
* @protected
*/
ODataPropertyBinding.prototype.initialize = function() {
if (this.oModel.oMetadata.isLoaded() && this.bInitial) {
this.checkUpdate(true);
this.bInitial = false;
}
};
/**
* Returns the current value of the bound target
* @return {object} the current value of the bound target
* @protected
*/
ODataPropertyBinding.prototype.getValue = function(){
return this.oValue;
};
/**
* Returns the current value of the bound target (incl. re-evaluation)
* @return {object} the current value of the bound target
*/
ODataPropertyBinding.prototype._getValue = function(){
return this.oModel._getObject(this.sPath, this.oContext);
};
/**
* @see sap.ui.model.PropertyBinding.prototype.setValue
*/
ODataPropertyBinding.prototype.setValue = function(oValue){
if (this.bSuspended) {
return;
}
if (!deepEqual(oValue, this.oValue) && this.oModel.setProperty(this.sPath, oValue, this.oContext, true)) {
this.oValue = oValue;
var oDataState = this.getDataState();
oDataState.setValue(this.oValue);
this.oModel.firePropertyChange({reason: ChangeReason.Binding, path: this.sPath, context: this.oContext, value: oValue});
}
};
/**
* Setter for context
*/
ODataPropertyBinding.prototype.setContext = function(oContext) {
var bForceUpdate,
oOldContext = this.oContext;
if (oContext && oContext.isPreliminary()) {
return;
}
if (Context.hasChanged(this.oContext, oContext)) {
this.oContext = oContext;
if (this.isRelative()) {
bForceUpdate = !!(oOldContext !== oContext
&& this.getDataState().getControlMessages().length);
this.checkUpdate(bForceUpdate);
}
}
};
/**
* Check whether this Binding would provide new values and in case it changed,
* inform interested parties about this.
*
* @param {boolean} force no cache true/false: Default = false
*
*/
ODataPropertyBinding.prototype.checkUpdate = function(bForceUpdate){
if (this.bSuspended && !bForceUpdate) {
return;
}
var oDataState = this.getDataState();
var bChanged = false;
var vOriginalValue = this.oModel.getOriginalProperty(this.sPath, this.oContext);
if (bForceUpdate || !deepEqual(vOriginalValue, this.vOriginalValue)) {
this.vOriginalValue = vOriginalValue;
oDataState.setOriginalValue(vOriginalValue);
bChanged = true;
}
var oValue = this._getValue();
if (bForceUpdate || !deepEqual(oValue, this.oValue)) {
this.oValue = oValue;
oDataState.setValue(this.oValue);
this._fireChange({reason: ChangeReason.Change});
bChanged = true;
}
if (bChanged) {
this.checkDataState();
}
};
/**
* Checks whether an update of the data state of this binding is required.
*
* @param {map} mPaths A Map of paths to check if update needed
* @private
*/
ODataPropertyBinding.prototype.checkDataState = function(mPaths) {
var sCanonicalPath = this.oModel.resolve(this.sPath, this.oContext, true)
|| this.oModel.resolve(this.sPath, this.oContext);
this.getDataState().setLaundering(!!mPaths && !!(sCanonicalPath in mPaths));
PropertyBinding.prototype._checkDataState.call(this, sCanonicalPath, mPaths);
};
/**
* Returns <code>true</code>, as this binding supports the feature of not propagating model
* messages to the control.
*
* @returns {boolean} <code>true</code>
*
* @public
* @see sap.ui.model.Binding#getIgnoreMessages
* @see sap.ui.model.Binding#setIgnoreMessages
* @since 1.82.0
*/
// @override sap.ui.model.Binding#supportsIgnoreMessages
ODataPropertyBinding.prototype.supportsIgnoreMessages = function () {
return true;
};
return ODataPropertyBinding;
});