0
|
1 define([ "dojo/_base/declare", "../safe" ], function(declare, safe) {
|
|
2 return declare(null, {
|
|
3 /**
|
|
4 * Отображение одного типа объектов в другой.
|
|
5 *
|
|
6 * @remarks Отображения являются односторонними, т.е. позволяют
|
|
7 * перенести часть содержимого одного объекта в другой. Каждая
|
|
8 * схема отображения строится из набора примитивных
|
|
9 * отображений, которые будут применены в произвольном порядке.
|
|
10 */
|
|
11 _schema : null,
|
|
12
|
|
13 constructor : function(schema) {
|
|
14 this._schema = schema;
|
|
15 },
|
|
16
|
|
17 /**
|
|
18 * Осуществляет отображение одного объекта в другой
|
|
19 *
|
|
20 * @src{Object} Исходный объект из которого будут взяты данные
|
|
21 * @dst{Object}
|
|
22 */
|
|
23 map : function(src, dst, ctx) {
|
|
24 safe.argumentNotNull(src, "src");
|
|
25 safe.argumentNotNull(dst, "dst");
|
|
26
|
|
27 for ( var p in this._schema) {
|
|
28 var mapper = this._schema[p];
|
|
29 if (mapper instanceof Function) {
|
|
30 dst[p] = mapper(src[p]);
|
|
31 } else if (mapper && mapper.map) {
|
|
32 mapper.map(src, dst, p, ctx);
|
|
33 } else {
|
|
34 this._defaultMapper(src, dst, p, mapper, ctx);
|
|
35 }
|
|
36 }
|
|
37 },
|
|
38
|
|
39 _defaultMapper : function(src, dst, prop, opts) {
|
|
40 if (typeof (opts) == "string") {
|
|
41 if (opts in src)
|
|
42 dst[prop] = src[opts];
|
|
43 } else if (opts && opts.type instanceof Function) {
|
|
44 if (src[prop] instanceof opts.type)
|
|
45 dst[prop] = src[prop];
|
|
46 else
|
|
47 dst[prop] = this._isPrimitiveType(opts.type) ? opts.type
|
|
48 .call(null, src[prop]) : new opts.type(src[prop]);
|
|
49
|
|
50 } else {
|
|
51 if (!(prop in src))
|
|
52 if (opts && opts.required)
|
|
53 throw new Error("The " + prop + "is missing");
|
|
54 else
|
|
55 return;
|
|
56 dst[prop] = src[prop];
|
|
57 }
|
|
58 },
|
|
59
|
|
60 _isPrimitiveType : function(type) {
|
|
61 return (type === String || type === Number || type === Boolean
|
|
62 || type === Number || type === Date);
|
|
63 }
|
|
64
|
|
65 });
|
|
66
|
|
67 }); |