0
|
1 define([
|
|
2 "dojo/_base/declare",
|
1
|
3 "../safe",
|
0
|
4 "dojo/when",
|
|
5 "dojo/store/util/QueryResults" ],
|
|
6
|
|
7 function(declare, safe, when, QueryResults) {
|
|
8
|
|
9 "use strict";
|
|
10
|
|
11 /**
|
|
12 * Обертка вокруг произвольного хранилища, только для чтения. Используется
|
|
13 * для преобразования данных, например, отображения в списках элементов
|
|
14 * пространственных данных.
|
|
15 */
|
|
16 return declare(null, {
|
|
17 /**
|
|
18 * @type{String} Свойство, хранящее идентификатор
|
|
19 */
|
|
20 idProperty : null,
|
|
21
|
|
22 _store : null,
|
|
23
|
|
24 /**
|
|
25 * @param{String} opts.idProperty Имя свойства, в которое будет записан
|
|
26 * идентификатор, если не указан, то идентификатор будет
|
|
27 * взят из родительского хранилища или использоваться
|
|
28 * строка <code>id</code>
|
|
29 * @param{dojo.store} opts.store Родительское хранилище
|
|
30 */
|
|
31 constructor : function(opts) {
|
|
32 safe.argumentNotNull(opts, "opts");
|
|
33 safe.argumentNotNull(opts.store, "opts.store");
|
|
34
|
|
35 this._store = opts.store;
|
|
36 delete opts.store;
|
|
37 declare.safeMixin(this, opts);
|
|
38 this.idProperty = opts.idProperty || this._store.idProperty || "id";
|
|
39 },
|
|
40
|
|
41 getParentStore : function() {
|
|
42 return this._store;
|
|
43 },
|
|
44
|
|
45 get : function(id) {
|
|
46 var me = this;
|
|
47 return when(me._store.get(id), function(x) {
|
|
48 var m = me.mapItem(x);
|
|
49 if (!(me.idProperty in m))
|
|
50 m[me.idProperty] = id;
|
|
51 return m;
|
|
52 });
|
|
53 },
|
|
54
|
|
55 /**
|
|
56 * Выполняет запрос в родительском хранилище, для этого используется
|
|
57 * <code>translateQuery</code> для подготовки запроса, затем,
|
|
58 * <code>mapItem</code> для преобразования результатов.
|
|
59 */
|
|
60 query : function(q, options) {
|
|
61 var me = this, store = this._store;
|
|
62 return when(store.query(me.translateQuery(q), me
|
|
63 .translateOptions(options)), function(res) {
|
|
64 var total = res.total;
|
|
65 var mapped = res.map(function(x) {
|
|
66 var m = me.mapItem(x);
|
|
67 if (!(me.idProperty in m))
|
|
68 m[me.idProperty] = store.getIdentity &&
|
|
69 store.getIdentity(x);
|
|
70 return m;
|
|
71 });
|
|
72 mapped.total = total;
|
|
73 var results = new QueryResults(mapped);
|
|
74 console.log(results);
|
|
75 return results;
|
|
76 });
|
|
77 },
|
|
78
|
|
79 getIdentity : function(obj) {
|
|
80 return obj && obj[this.idProperty];
|
|
81 },
|
|
82
|
|
83 /**
|
|
84 * Преобразование запроса в формат родительского хранилища.
|
|
85 *
|
|
86 * @param{Object} q Запрос в формате текущего хранилища
|
|
87 * @returns{Object} Запрос в формате родительского хранилища
|
|
88 */
|
|
89 translateQuery : function(q) {
|
|
90 return q;
|
|
91 },
|
|
92
|
|
93 translateOptions : function(options) {
|
|
94 return options;
|
|
95 },
|
|
96
|
|
97 /**
|
|
98 * Преобразование объекта из родительского хранилища. При преобразовании
|
|
99 * в объекте можно задать идентификатор, иначе идентификатор будет
|
|
100 * автоматически получен и присвоен из родительского хранилища
|
|
101 *
|
|
102 * @param{Object} item Объект из родительского хранилища
|
|
103 * @returns{Object} результат преобразования
|
|
104 */
|
|
105 mapItem : function(item) {
|
|
106 return item;
|
|
107 }
|
|
108 });
|
|
109
|
|
110 }); |