1 | define([ |
---|
2 | "dojo/_base/declare", |
---|
3 | "dojo/_base/array", |
---|
4 | "dojo/_base/lang", |
---|
5 | "dijit/tree/ForestStoreModel"], function(declare, array, lang, ForestStoreModel){ |
---|
6 | |
---|
7 | return declare("dojox.grid.LazyTreeGridStoreModel", ForestStoreModel, { |
---|
8 | |
---|
9 | // There are different approaches to get children for client-side |
---|
10 | // DataStore (e.g. dojo.data.ItemFileReadStore) or server-side DataStore |
---|
11 | // (e.g. dojox.data.QueryReadStore), so we need to be sure what kind of |
---|
12 | // DataStore is being used |
---|
13 | serverStore: false, // server side store |
---|
14 | |
---|
15 | constructor: function(/* Object */ args){ |
---|
16 | this.serverStore = !!args.serverStore; |
---|
17 | }, |
---|
18 | |
---|
19 | mayHaveChildren: function(/*dojo.data.Item*/ item){ |
---|
20 | var children = null; |
---|
21 | return array.some(this.childrenAttrs, function(attr){ |
---|
22 | children = this.store.getValue(item, attr); |
---|
23 | if(lang.isString(children)){ |
---|
24 | return parseInt(children, 10) > 0 || children.toLowerCase() === "true" ? true : false; |
---|
25 | }else if(typeof children == "number"){ |
---|
26 | return children > 0; |
---|
27 | }else if(typeof children == "boolean"){ |
---|
28 | return children; |
---|
29 | }else if(this.store.isItem(children)){ |
---|
30 | children = this.store.getValues(item, attr); |
---|
31 | return lang.isArray(children) ? children.length > 0 : false; |
---|
32 | }else{ |
---|
33 | return false; |
---|
34 | } |
---|
35 | }, this); |
---|
36 | }, |
---|
37 | |
---|
38 | getChildren: function(/*dojo.data.Item*/parentItem, /*function(items, size)*/onComplete, /*function*/ onError, /*object*/queryObj){ |
---|
39 | if(queryObj){ |
---|
40 | var start = queryObj.start || 0, |
---|
41 | count = queryObj.count, |
---|
42 | parentId = queryObj.parentId, |
---|
43 | sort = queryObj.sort; |
---|
44 | if(parentItem === this.root){ |
---|
45 | this.root.size = 0; |
---|
46 | this.store.fetch({ |
---|
47 | start: start, |
---|
48 | count: count, |
---|
49 | sort: sort, |
---|
50 | query: this.query, |
---|
51 | onBegin: lang.hitch(this, function(size){ |
---|
52 | this.root.size = size; |
---|
53 | }), |
---|
54 | onComplete: lang.hitch(this, function(items){ |
---|
55 | onComplete(items, queryObj, this.root.size); |
---|
56 | }), |
---|
57 | onError: onError |
---|
58 | }); |
---|
59 | }else{ |
---|
60 | var store = this.store; |
---|
61 | if(!store.isItemLoaded(parentItem)){ |
---|
62 | var getChildren = lang.hitch(this, arguments.callee); |
---|
63 | store.loadItem({ |
---|
64 | item: parentItem, |
---|
65 | onItem: function(parentItem){ |
---|
66 | getChildren(parentItem, onComplete, onError, queryObj); |
---|
67 | }, |
---|
68 | onError: onError |
---|
69 | }); |
---|
70 | return; |
---|
71 | } |
---|
72 | if(this.serverStore && !this._isChildrenLoaded(parentItem)){ |
---|
73 | this.childrenSize = 0; |
---|
74 | this.store.fetch({ |
---|
75 | start: start, |
---|
76 | count: count, |
---|
77 | sort: sort, |
---|
78 | query: lang.mixin({parentId: parentId}, this.query || {}), |
---|
79 | onBegin: lang.hitch(this, function(size){ |
---|
80 | this.childrenSize = size; |
---|
81 | }), |
---|
82 | onComplete: lang.hitch(this, function(items){ |
---|
83 | onComplete(items, queryObj, this.childrenSize); |
---|
84 | }), |
---|
85 | onError: onError |
---|
86 | }); |
---|
87 | }else{ |
---|
88 | this.inherited(arguments); |
---|
89 | } |
---|
90 | } |
---|
91 | }else{ |
---|
92 | this.inherited(arguments); |
---|
93 | } |
---|
94 | }, |
---|
95 | |
---|
96 | _isChildrenLoaded: function(parentItem){ |
---|
97 | // summary: |
---|
98 | // Check if all children of the given item have been loaded |
---|
99 | var children = null; |
---|
100 | return array.every(this.childrenAttrs, function(attr){ |
---|
101 | children = this.store.getValues(parentItem, attr); |
---|
102 | return array.every(children, function(c){ |
---|
103 | return this.store.isItemLoaded(c); |
---|
104 | }, this); |
---|
105 | }, this); |
---|
106 | }, |
---|
107 | |
---|
108 | //overwritten |
---|
109 | onNewItem: function(item, parentInfo){ }, |
---|
110 | |
---|
111 | onDeleteItem: function(item){ } |
---|
112 | }); |
---|
113 | }); |
---|