MWF.xDesktop.requireApp("process.Xform", "Div", null, false);
/** @class Source 数据源组件。
* @o2cn 数据源
* @example
* //可以在脚本中获取该组件
* //方法1:
* var source = this.form.get("fieldId"); //获取数据源组件
* //方法2
* var source = this.target; //在组件本身的脚本中获取
* @extends MWF.xApplication.process.Xform.Div
* @o2category FormComponents
* @o2range {Portal}
* @hideconstructor
*/
MWF.xApplication.process.Xform.Source = MWF.APPSource = new Class(
/** @lends MWF.xApplication.process.Xform.Source# */
{
Extends: MWF.APPDiv,
options: {
/**
* 加载数据后执行,但这时还未加载下属组件,可以可以使用this.target.data获取数据进行修改。
* @event MWF.xApplication.process.Xform.Source#postLoadData
* @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zTS|组件事件说明}
*/
/**
* 加载数据、下属组件后执行。
* @event MWF.xApplication.process.Xform.Source#loadData
* @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zTS|组件事件说明}
*/
"moduleEvents": ["queryLoad","postLoad","load", "postLoadData", "loadData"]
},
_loadUserInterface: function(){
this.data = null;
if (this.json.path){
if (this.json.sourceType=="o2"){
if (this.json.path) this._getO2Source();
}
}
},
_getO2Address: function(){
try {
this.json.service = JSON.parse(this.json.contextRoot);
}catch(e){
this.json.service = {"root": this.json.contextRoot, "action":"", "method": "", "url": ""};
}
var addressObj = layout.serviceAddressList[this.json.service.root];
var defaultPort = layout.config.app_protocol==='https' ? "443" : "80";
if (addressObj){
var appPort = addressObj.port || window.location.port;
this.address = layout.config.app_protocol+"//"+(addressObj.host || window.location.hostname)+((!appPort || appPort.toString()===defaultPort) ? "" : ":"+appPort)+addressObj.context;
// this.address = layout.config.app_protocol+"//"+addressObj.host+(addressObj.port==80 ? "" : ":"+addressObj.port)+addressObj.context;
}else{
var host = layout.desktop.centerServer.host || window.location.hostname;
var port = layout.desktop.centerServer.port || window.location.port;
this.address = layout.config.app_protocol+"//"+host+((!port || port.toString()===defaultPort) ? "" : ":"+port)+"/"+this.json.service.root;;
}
},
//_getConfigParameters: function(){
//
// return pars;
//},
_getO2Uri: function(){
//var uri = this.json.path || this.json.selectPath;
var uri = this.json.path;
var pars = {};
if (this.json.parameters){
Object.each(this.json.parameters, function(v, key){
if (uri.indexOf("{"+key+"}")!=-1){
var reg = new RegExp("{"+key+"}", "g");
uri = uri.replace(reg, encodeURIComponent((v && v.code) ? (this.form.Macro.exec(v.code, this) || "") : v));
}else{
pars[key] = v;
}
}.bind(this));
}
var data = null;
if (this.json.requestBody){
if (this.json.requestBody.code){
data = this.form.Macro.exec(this.json.requestBody.code, this)
}
}
if (this.json.httpMethod=="GET" || this.json.httpMethod=="OPTIONS" || this.json.httpMethod=="HEAD" || this.json.httpMethod=="DELETE"){
var tag = "?";
if (uri.indexOf("?")!=-1) tag = "&";
Object.each(pars, function(v, k){
var value = (v && v.code) ? (this.form.Macro.exec(v.code, this) || "") : v;
uri = uri+tag+k+"="+value;
}.bind(this));
}else{
Object.each(pars, function(v, k){
if (!data) data = {};
var value = (v && v.code) ? (this.form.Macro.exec(v.code, this) || "") : v;
data[k] = value;
}.bind(this));
}
this.body = data;
this.uri = this.address+uri;
},
_getO2Source: function(){
this._getO2Address();
if (!this.json.isDelay){
this._getO2Uri();
this._invoke(function(){
this._loadSub(this.node);
this.fireEvent("loadData");
}.bind(this));
}
},
active: function(){
this._getO2Uri();
this._invoke(function(){
this._loadSub(this.node);
this.fireEvent("loadData");
}.bind(this));
},
_invoke: function(callback){
MWF.restful(this.json.httpMethod, this.uri, JSON.encode(this.body), function(json){
/**
* @summary 该属性获取当前数据源的数据,当数据源加载完成后才有值。
* @member {Array|Object|String|Number|Boolean|Null}
* @example
* var field = this.form.get("fieldId").data; //获取数据源数据
*/
this.data = json;
this.fireEvent("postLoadData");
if (callback) callback();
}.bind(this), true, true);
},
setBody: function(data){
this.body = data;
},
/**
* @summary 替换全部的url参数,但不刷新组件
* @param {Object} url参数
* @example
* //如,原来的组件url参数为:
* { "page" : 1, "count" : 10 }
*
* this.form.get("fieldId").setParameters({"id":"662ede34-4e21-428a-9c3b-f1bf14d15650"});
*
* //执行后变为
* {"id":"662ede34-4e21-428a-9c3b-f1bf14d15650"}
*/
setParameters: function(json){
this.json.parameters = json;
this._getO2Address();
this._getO2Uri();
},
/**
* @summary 新增url参数,但不刷新组件。如果该参数key已经存在,则覆盖
* @param {Object} url参数
* @example
* * //如,原来的组件url参数为:
* { "page" : 1, "count" : 10 }
*
* this.form.get("fieldId").addParameters({
* "page" : 2,
* "id":"662ede34-4e21-428a-9c3b-f1bf14d15650"
* });
*
* //执行后变为
* {
* "page" : 2,
* "count" : 10
* "id":"662ede34-4e21-428a-9c3b-f1bf14d15650"
* }
*/
addParameters: function(json){
if (!this.json.parameters) this.json.parameters={};
Object.each(json, function(v, k){
this.json.parameters[k] = v;
}.bind(this));
this._getO2Address();
this._getO2Uri();
},
/**
* @summary 重新加载组件。会触发loadData事件
* @param {Boolean} notInit - false表示不重新初始化子数据源和数据文本,true表示重新初始化,默认为false
* @param {Function} callback 加载完成后的回调
* @example
* this.form.get("fieldId").reload(); //重新加载组件
*/
reload: function(notInit, callback){
this._getO2Uri();
this._invoke(function(){
this._loadSub(this.node, notInit);
this.fireEvent("loadData");
if (callback) callback();
}.bind(this));
},
_loadSub: function(dom, notInit){
var subDom = dom.getFirst();
var module = null;
while (subDom){
module = null;
module = subDom.retrieve("module", null);
if (module){
if (module._loadJsonData) module._loadJsonData(notInit);
}else{
this._loadSub(subDom);
}
//var type = subDom.get("MWFtype");
//if (type){
// if (type=="sourceText"){
// module = subDom.retrieve("module");
// module._loadData();
// }else if (type=="subSource"){
// module = subDom.retrieve("module");
// module._loadData();
// }else{
// this._loadSub(subDom);
// }
//}else{
// this._loadSub(subDom);
//}
subDom = subDom.getNext();
}
}
});
source