comparison src/implab/data/declare-model.js @ 34:27e8e9e38e07 default tip

Слияние
author nickolay
date Wed, 05 Jun 2019 20:44:15 +0300
parents 8af8e840dd49 1dc2fd263b90
children
comparison
equal deleted inserted replaced
33:8af8e840dd49 34:27e8e9e38e07
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 });