@openui5/sap.ui.core
Version:
OpenUI5 Core Library sap.ui.core
187 lines (163 loc) • 4.88 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 client-based DataBinding implementation
sap.ui.define([
"sap/ui/thirdparty/jquery",
'./Model',
'./ClientContextBinding',
'./ClientListBinding', // convenience dependency for legacy code using global names
'./ClientPropertyBinding', // convenience dependency for legacy code using global names
'./ClientTreeBinding' // convenience dependency for legacy code using global names
],
function(
jQuery,
Model,
ClientContextBinding
) {
"use strict";
/**
* Constructor for a new ClientModel.
*
* @class Model implementation for Client models
* @abstract
* @extends sap.ui.model.Model
*
* @author SAP SE
* @version 1.87.1
*
* @param {string} [oData] URL where to load the data from
* @public
* @alias sap.ui.model.ClientModel
*/
var ClientModel = Model.extend("sap.ui.model.ClientModel", /** @lends sap.ui.model.ClientModel.prototype */ {
constructor : function(oData) {
Model.apply(this, arguments);
this.bCache = true;
this.aPendingRequestHandles = [];
this.mUnsupportedFilterOperators = {"Any": true, "All": true};
if (typeof oData == "string") {
this.loadData(oData);
}
},
metadata : {
publicMethods : ["loadData", "setData", "getData", "setProperty", "forceNoCache"]
}
});
/**
* Returns the current data of the model.
*
* Be aware that the returned object is a reference to the model data so all changes to that data will also change the model data.
*
* @returns {any} the data object
* @public
*/
ClientModel.prototype.getData = function(){
return this.oData;
};
/**
* @see sap.ui.model.Model.prototype.createBindingContext
*
*/
ClientModel.prototype.createBindingContext = function(sPath, oContext, mParameters, fnCallBack) {
// optional parameter handling
if (typeof oContext == "function") {
fnCallBack = oContext;
oContext = null;
}
if (typeof mParameters == "function") {
fnCallBack = mParameters;
mParameters = null;
}
// resolve path and create context
var sContextPath = this.resolve(sPath, oContext),
oNewContext = (sContextPath == undefined) ? undefined : this.getContext(sContextPath ? sContextPath : "/");
if (!oNewContext) {
oNewContext = null;
}
if (fnCallBack) {
fnCallBack(oNewContext);
}
return oNewContext;
};
ClientModel.prototype._ajax = function(oParameters){
var that = this;
if (this.bDestroyed) {
return;
}
function wrapHandler(fn) {
return function() {
// request finished, remove request handle from pending request array
if (that.aPendingRequestHandles){
var iIndex = that.aPendingRequestHandles.indexOf(oRequestHandle);
if (iIndex > -1) {
that.aPendingRequestHandles.splice(iIndex, 1);
}
}
// call original handler method
if (!(oRequestHandle && oRequestHandle.bSuppressErrorHandlerCall)) {
fn.apply(this, arguments);
}
};
}
oParameters.success = wrapHandler(oParameters.success);
oParameters.error = wrapHandler(oParameters.error);
var oRequestHandle = jQuery.ajax(oParameters);
// add request handle to array and return it (only for async requests)
if (oParameters.async) {
this.aPendingRequestHandles.push(oRequestHandle);
}
};
/**
* @see sap.ui.model.Model.prototype.destroy
* @public
*/
ClientModel.prototype.destroy = function() {
Model.prototype.destroy.apply(this, arguments);
// Abort pending requests
if (this.aPendingRequestHandles) {
for (var i = this.aPendingRequestHandles.length - 1; i >= 0; i--) {
var oRequestHandle = this.aPendingRequestHandles[i];
if (oRequestHandle && oRequestHandle.abort) {
oRequestHandle.bSuppressErrorHandlerCall = true;
oRequestHandle.abort();
}
}
delete this.aPendingRequestHandles;
}
};
/**
* @see sap.ui.model.Model.prototype.destroyBindingContext
*
*/
ClientModel.prototype.destroyBindingContext = function(oContext) {
// TODO: what todo here?
};
/**
* @see sap.ui.model.Model.prototype.bindContext
*/
ClientModel.prototype.bindContext = function(sPath, oContext, mParameters) {
var oBinding = new ClientContextBinding(this, sPath, oContext, mParameters);
return oBinding;
};
/**
* update all bindings
* @param {boolean} bForceUpdate true/false: Default = false. If set to false an update
* will only be done when the value of a binding changed.
* @public
*/
ClientModel.prototype.updateBindings = function(bForceUpdate) {
this.checkUpdate(bForceUpdate);
};
/**
* Force no caching.
* @param {boolean} [bForceNoCache=false] whether to force not to cache
* @public
*/
ClientModel.prototype.forceNoCache = function(bForceNoCache) {
this.bCache = !bForceNoCache;
};
return ClientModel;
});