dojox
Version:
Dojo eXtensions, a rollup of many useful sub-projects and varying states of maturity – from very stable and robust, to alpha and experimental. See individual projects contain README files for details.
111 lines (107 loc) • 3.91 kB
JavaScript
define(["dojo/_base/lang", "dojo/Deferred", "dojo/when"],
function(lang, Deferred, when){
return function(/*Object*/config, /*Object*/params, /*String*/item){
// summary:
// simpleModel is called for each simple model, to create the simple model from the DataStore
// based upon the store and query params.
// It will also load models and return the either the loadedModels or a promise.
// description:
// Called for each model with a modelLoader of "dojox/app/utils/simpleModel", it will
// create the model based upon the store and query params set for the model in the config.
// config: Object
// The models section of the config for this view or for the app.
// params: Object
// The params set into the config for this model.
// item: String
// The String with the name of this model
// returns: model
// The model, of the store and query params specified in the config for this model.
var loadedModels = {};
var loadSimpleModelDeferred = new Deferred();
var fixupQuery = function(query){
var ops = {};
for(var item in query){ // need this to handle query params without errors
if(item.charAt(0) !== "_"){
ops[item] = query[item];
}
}
return(ops);
};
var options, dataStoreCtor;
if(params.store){
if(!params.store.params){
throw new Error("Invalid store for model ["+item+"]");
}else if((params.store.params.data || params.store.params.store)){
options = {
"store": params.store.store,
"query": params.query ? fixupQuery(params.query) : params.store.query ? fixupQuery(params.store.query) : {}
};
}else if(params.store.params.url){
try{
dataStoreCtor = require("dojo/store/DataStore");
}catch(e){
throw new Error("dojo/store/DataStore must be listed in the dependencies");
}
options = {
"store": new dataStoreCtor({
store: params.store.store
}),
"query": params.query ? fixupQuery(params.query) : params.store.query ? fixupQuery(params.store.query) : {}
};
} else if(params.store.store){
// if query is not set on the model params, it may be set on the store
options = {
"store": params.store.store,
"query": params.query ? fixupQuery(params.query) : params.store.query ? fixupQuery(params.store.query) : {}
};
}
}else if(params.datastore){
try{
dataStoreCtor = require("dojo/store/DataStore");
}catch(e){
throw new Error("When using datastore the dojo/store/DataStore module must be listed in the dependencies");
}
options = {
"store": new dataStoreCtor({
store: params.datastore.store
}),
"query": fixupQuery(params.query)
};
}else if(params.data){
if(params.data && lang.isString(params.data)){
params.data = lang.getObject(params.data);
}
options = {"data": params.data, query: {}};
} else{
console.warn("simpleModel: Missing parameters.");
}
var createSimplePromise;
try{
if(options.store){
createSimplePromise = options.store.query();
}else{
createSimplePromise = options.data;
}
}catch(ex){
loadSimpleModelDeferred.reject("load simple model error.");
return loadSimpleModelDeferred.promise;
}
if(createSimplePromise.then){
when(createSimplePromise, lang.hitch(this, function(newModel){
// now the loadedModels[item].models is set.
//console.log("in simpleModel promise path, loadedModels = ", loadedModels);
loadedModels = newModel;
loadSimpleModelDeferred.resolve(loadedModels);
return loadedModels;
}), function(){
loadModelLoaderDeferred.reject("load model error.")
});
}else{ // query did not return a promise, so use newModel
loadedModels = createSimplePromise;
//console.log("in simpleModel else path, loadedModels = ",loadedModels);
loadSimpleModelDeferred.resolve(loadedModels);
return loadedModels;
}
return loadSimpleModelDeferred;
}
});