1 | define(["dojo/_base/lang", "dojo/Deferred", "dojo/when"], |
---|
2 | function(lang, Deferred, when){ |
---|
3 | return function(/*Object*/config, /*Object*/params, /*String*/item){ |
---|
4 | // summary: |
---|
5 | // simpleModel is called for each simple model, to create the simple model from the DataStore |
---|
6 | // based upon the store and query params. |
---|
7 | // It will also load models and return the either the loadedModels or a promise. |
---|
8 | // description: |
---|
9 | // Called for each model with a modelLoader of "dojox/app/utils/simpleModel", it will |
---|
10 | // create the model based upon the store and query params set for the model in the config. |
---|
11 | // config: Object |
---|
12 | // The models section of the config for this view or for the app. |
---|
13 | // params: Object |
---|
14 | // The params set into the config for this model. |
---|
15 | // item: String |
---|
16 | // The String with the name of this model |
---|
17 | // returns: model |
---|
18 | // The model, of the store and query params specified in the config for this model. |
---|
19 | var loadedModels = {}; |
---|
20 | var loadSimpleModelDeferred = new Deferred(); |
---|
21 | |
---|
22 | var fixupQuery = function(query){ |
---|
23 | var ops = {}; |
---|
24 | for(var item in query){ // need this to handle query params without errors |
---|
25 | if(item.charAt(0) !== "_"){ |
---|
26 | ops[item] = query[item]; |
---|
27 | } |
---|
28 | } |
---|
29 | return(ops); |
---|
30 | }; |
---|
31 | |
---|
32 | var options, dataStoreCtor; |
---|
33 | if(params.store){ |
---|
34 | if(!params.store.params){ |
---|
35 | throw new Error("Invalid store for model ["+item+"]"); |
---|
36 | }else if((params.store.params.data || params.store.params.store)){ |
---|
37 | options = { |
---|
38 | "store": params.store.store, |
---|
39 | "query": params.query ? fixupQuery(params.query) : params.store.query ? fixupQuery(params.store.query) : {} |
---|
40 | }; |
---|
41 | }else if(params.store.params.url){ |
---|
42 | try{ |
---|
43 | dataStoreCtor = require("dojo/store/DataStore"); |
---|
44 | }catch(e){ |
---|
45 | throw new Error("dojo/store/DataStore must be listed in the dependencies"); |
---|
46 | } |
---|
47 | options = { |
---|
48 | "store": new dataStoreCtor({ |
---|
49 | store: params.store.store |
---|
50 | }), |
---|
51 | "query": params.query ? fixupQuery(params.query) : params.store.query ? fixupQuery(params.store.query) : {} |
---|
52 | }; |
---|
53 | } else if(params.store.store){ |
---|
54 | // if query is not set on the model params, it may be set on the store |
---|
55 | options = { |
---|
56 | "store": params.store.store, |
---|
57 | "query": params.query ? fixupQuery(params.query) : params.store.query ? fixupQuery(params.store.query) : {} |
---|
58 | }; |
---|
59 | } |
---|
60 | }else if(params.datastore){ |
---|
61 | try{ |
---|
62 | dataStoreCtor = require("dojo/store/DataStore"); |
---|
63 | }catch(e){ |
---|
64 | throw new Error("When using datastore the dojo/store/DataStore module must be listed in the dependencies"); |
---|
65 | } |
---|
66 | options = { |
---|
67 | "store": new dataStoreCtor({ |
---|
68 | store: params.datastore.store |
---|
69 | }), |
---|
70 | "query": fixupQuery(params.query) |
---|
71 | }; |
---|
72 | }else if(params.data){ |
---|
73 | if(params.data && lang.isString(params.data)){ |
---|
74 | params.data = lang.getObject(params.data); |
---|
75 | } |
---|
76 | options = {"data": params.data, query: {}}; |
---|
77 | } else{ |
---|
78 | console.warn("simpleModel: Missing parameters."); |
---|
79 | } |
---|
80 | var createSimplePromise; |
---|
81 | try{ |
---|
82 | if(options.store){ |
---|
83 | createSimplePromise = options.store.query(); |
---|
84 | }else{ |
---|
85 | createSimplePromise = options.data; |
---|
86 | } |
---|
87 | }catch(ex){ |
---|
88 | loadSimpleModelDeferred.reject("load simple model error."); |
---|
89 | return loadSimpleModelDeferred.promise; |
---|
90 | } |
---|
91 | if(createSimplePromise.then){ |
---|
92 | when(createSimplePromise, lang.hitch(this, function(newModel){ |
---|
93 | // now the loadedModels[item].models is set. |
---|
94 | //console.log("in simpleModel promise path, loadedModels = ", loadedModels); |
---|
95 | loadedModels = newModel; |
---|
96 | loadSimpleModelDeferred.resolve(loadedModels); |
---|
97 | return loadedModels; |
---|
98 | }), function(){ |
---|
99 | loadModelLoaderDeferred.reject("load model error.") |
---|
100 | }); |
---|
101 | }else{ // query did not return a promise, so use newModel |
---|
102 | loadedModels = createSimplePromise; |
---|
103 | //console.log("in simpleModel else path, loadedModels = ",loadedModels); |
---|
104 | loadSimpleModelDeferred.resolve(loadedModels); |
---|
105 | return loadedModels; |
---|
106 | } |
---|
107 | |
---|
108 | return loadSimpleModelDeferred; |
---|
109 | } |
---|
110 | }); |
---|