0
|
1 define([ "dojo/_base/declare", "./_ModelBase", "./MapSchema" ], function(
|
|
2 declare, _ModelBase, MapSchema) {
|
|
3 /**
|
|
4 * Создает новый класс, унаследованный от ./ModelBase, с указанной схемой
|
|
5 * отображения данных.
|
|
6 *
|
|
7 * @details Модель представляет собой объект, живущий в рамках контекста
|
|
8 * данных, также имеющий две схемы отображения: из модели хранения
|
|
9 * в источнике данных (toObjectMap) и наооборот в модель хранения в
|
|
10 * источнике данных (fromObjectMap).
|
|
11 *
|
|
12 * Описание схемы выглядит следующим образом
|
|
13 * <pre>
|
|
14 * {
|
|
15 * name : null, // отображение в обе стороны без преобразования
|
|
16 *
|
|
17 * age : Number, // при преобразоваении к объекту поле будет преобразовано dst.age = Number(src.age)
|
|
18 * // обратное преобразование отсутстсвует
|
|
19 *
|
|
20 * age : [Number, null] // тоже самое что и age : Number
|
|
21 *
|
|
22 * date : [Date, function(v) { return v.toString() }] // указывается преобразование в одну и в другую сторону
|
|
23 * }
|
|
24 * <pre>
|
|
25 */
|
|
26 return function(schema, mixins, opts) {
|
|
27 var fromObjectSchema = {}, toObjectSchema = {};
|
|
28 if (schema !== null && schema !== undefined) {
|
|
29 for ( var p in schema) {
|
|
30 var mapper = schema[p];
|
|
31
|
|
32 if (mapper instanceof Array) {
|
|
33 toObjectSchema[p] = mapper[0];
|
|
34 fromObjectSchema[p] = mapper[1];
|
|
35 } else {
|
|
36 toObjectSchema[p] = mapper;
|
|
37 fromObjectSchema[p] = null;
|
|
38 }
|
|
39 }
|
|
40 }
|
|
41
|
|
42 if (arguments.length < 3) {
|
|
43 opts = mixins;
|
|
44 mixins = undefined;
|
|
45 }
|
|
46
|
|
47 var base = [ _ModelBase ];
|
|
48 if (mixins) {
|
|
49 if (mixins instanceof Array)
|
|
50 base = base.concat(mixins);
|
|
51 else
|
|
52 base.push(mixins);
|
|
53 }
|
|
54
|
|
55 var model = declare(base, opts);
|
|
56
|
|
57 model.toObjectMap = new MapSchema(toObjectSchema);
|
|
58
|
|
59 model.fromObjectMap = new MapSchema(fromObjectSchema);
|
|
60
|
|
61 model.readData = function(that, data, context) {
|
|
62 model.toObjectMap.map(data, that, context);
|
|
63 };
|
|
64
|
|
65 model.writeData = function(that, data, context) {
|
|
66 data = data || {};
|
|
67 model.fromObjectMap.map(that, data, context);
|
|
68 };
|
|
69
|
|
70 return model;
|
|
71 };
|
|
72 }); |