[483] | 1 | define(["dojo/_base/lang", "dojo/Deferred", "dojo/when", "dojox/mvc/getStateful"], |
---|
| 2 | function(lang, Deferred, when, getStateful){ |
---|
| 3 | return function(/*Object*/config, /*Object*/params, /*String*/item){ |
---|
| 4 | // summary: |
---|
| 5 | // mvcModel is called for each mvc model, to create the mvc model based upon the type and params. |
---|
| 6 | // It will also load models and return the either the loadedModels or a promise. |
---|
| 7 | // description: |
---|
| 8 | // Called for each model with a modelLoader of "dojox/app/utils/mvcModel", it will |
---|
| 9 | // create the model based upon the type and the params set for the model in the config. |
---|
| 10 | // config: Object |
---|
| 11 | // The models section of the config for this view or for the app. |
---|
| 12 | // params: Object |
---|
| 13 | // The params set into the config for this model. |
---|
| 14 | // item: String |
---|
| 15 | // The String with the name of this model |
---|
| 16 | // returns: model |
---|
| 17 | // The model, of the type specified in the config for this model. |
---|
| 18 | var loadedModels = {}; |
---|
| 19 | var loadMvcModelDeferred = new Deferred(); |
---|
| 20 | |
---|
| 21 | var fixupQuery = function(query){ |
---|
| 22 | var ops = {}; |
---|
| 23 | for(var item in query){ // need this to handle query params without errors |
---|
| 24 | if(item.charAt(0) !== "_"){ |
---|
| 25 | ops[item] = query[item]; |
---|
| 26 | } |
---|
| 27 | } |
---|
| 28 | return(ops); |
---|
| 29 | }; |
---|
| 30 | |
---|
| 31 | var options; |
---|
| 32 | if(params.store){ |
---|
| 33 | // if query is not set on the model params, it may be set on the store |
---|
| 34 | options = { |
---|
| 35 | "store": params.store.store, |
---|
| 36 | "query": params.query ? fixupQuery(params.query) : params.store.query ? fixupQuery(params.store.query) : {} |
---|
| 37 | }; |
---|
| 38 | }else if(params.datastore){ |
---|
| 39 | try{ |
---|
| 40 | var dataStoreCtor = require("dojo/store/DataStore"); |
---|
| 41 | }catch(e){ |
---|
| 42 | throw new Error("When using datastore the dojo/store/DataStore module must be listed in the dependencies"); |
---|
| 43 | } |
---|
| 44 | options = { |
---|
| 45 | "store": new dataStoreCtor({ |
---|
| 46 | store: params.datastore.store |
---|
| 47 | }), |
---|
| 48 | "query": fixupQuery(params.query) |
---|
| 49 | }; |
---|
| 50 | }else if(params.data){ |
---|
| 51 | if(params.data && lang.isString(params.data)){ |
---|
| 52 | //get the object specified by string value of data property |
---|
| 53 | //cannot assign object literal or reference to data property |
---|
| 54 | //because json.ref will generate __parent to point to its parent |
---|
| 55 | //and will cause infinitive loop when creating StatefulModel. |
---|
| 56 | params.data = lang.getObject(params.data); |
---|
| 57 | } |
---|
| 58 | options = {"data": params.data, query: {}}; |
---|
| 59 | } |
---|
| 60 | else{ |
---|
| 61 | console.warn("mvcModel: Missing parameters."); |
---|
| 62 | } |
---|
| 63 | |
---|
| 64 | var type = config[item].type ? config[item].type : "dojox/mvc/EditStoreRefListController"; |
---|
| 65 | // need to load the class to use for the model |
---|
| 66 | // modelLoader must be listed in the dependencies and has thus already been loaded so it _must_ be here |
---|
| 67 | // => no need for complex code here |
---|
| 68 | try{ |
---|
| 69 | var modelCtor = require(type); |
---|
| 70 | }catch(e){ |
---|
| 71 | throw new Error(type+" must be listed in the dependencies"); |
---|
| 72 | } |
---|
| 73 | var newModel = new modelCtor(options); |
---|
| 74 | var createMvcPromise; |
---|
| 75 | try{ |
---|
| 76 | if(newModel.queryStore){ |
---|
| 77 | createMvcPromise = newModel.queryStore(options.query); |
---|
| 78 | }else{ |
---|
| 79 | var modelProp = newModel._refSourceModelProp || newModel._refModelProp || "model"; |
---|
| 80 | newModel.set(modelProp, getStateful(options.data)); |
---|
| 81 | createMvcPromise = newModel; |
---|
| 82 | } |
---|
| 83 | }catch(ex){ |
---|
| 84 | //console.warn("load mvc model error.", ex); |
---|
| 85 | loadMvcModelDeferred.reject("load mvc model error."); |
---|
| 86 | return loadMvcModelDeferred.promise; |
---|
| 87 | } |
---|
| 88 | when(createMvcPromise, lang.hitch(this, function(){ |
---|
| 89 | // now the loadedModels[item].models is set. |
---|
| 90 | loadedModels = newModel; |
---|
| 91 | loadMvcModelDeferred.resolve(loadedModels); |
---|
| 92 | //this.app.log("in mvcModel promise path, loadedModels = ", loadedModels); |
---|
| 93 | return loadedModels; |
---|
| 94 | }), function(){ |
---|
| 95 | loadMvcModelDeferred.reject("load model error.") |
---|
| 96 | }); |
---|
| 97 | return loadMvcModelDeferred; |
---|
| 98 | } |
---|
| 99 | }); |
---|