Mercurial > pub > ImplabJs
comparison core/src/js/data/declare-model.js @ 29:acdcdf1a8d21
repository reorganized
author | cin |
---|---|
date | Tue, 26 Jun 2018 19:35:44 +0300 |
parents | src/implab/data/declare-model.js@fc2517695ee1 |
children |
comparison
equal
deleted
inserted
replaced
28:d796bbbe558c | 29:acdcdf1a8d21 |
---|---|
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 }); |