|
2 | 2 | dop.core.observer = function(callback, id) { |
3 | 3 | this.callback = callback; |
4 | 4 | this.id = id; |
5 | | - this.objects = []; |
6 | | - this.properties = {}; |
| 5 | + this.observers = {}; // need it for destroy() |
| 6 | + this.observers_prop = {}; // need it for destroy() |
7 | 7 | }; |
8 | 8 |
|
9 | 9 |
|
10 | | -dop.core.observer.prototype.observe = function(object) { |
| 10 | +dop.core.observer.prototype.observe = function(object, property) { |
11 | 11 | dop.util.invariant(dop.isRegistered(object), 'observer.observe needs a registered object as first parameter'); |
12 | | - var object_dop = dop.getObjectDop(object); |
13 | | - if (object_dop.om[this.id] === undefined) { |
14 | | - // Storing in object |
15 | | - object_dop.om[this.id] = true; |
16 | | - // Storing in observer |
17 | | - this.objects.push(object); // using for .destroy() |
| 12 | + |
| 13 | + var path_id = dop.core.getPathId(dop.getObjectPath(object, false)), |
| 14 | + data_path = dop.data.path, |
| 15 | + type = 'observers'; |
| 16 | + |
| 17 | + // is observeProperty |
| 18 | + if (arguments.length === 2) { |
| 19 | + type = 'observers_prop'; |
| 20 | + path_id += dop.core.pathSeparator(property); |
18 | 21 | } |
19 | | -}; |
20 | | -dop.core.observer.prototype.unobserve = function(object) { |
21 | | - dop.util.invariant(dop.isRegistered(object), 'observer.unobserve needs a registered object as first parameter'); |
22 | | - // Removing from object |
23 | | - delete dop.getObjectDop(object).om[this.id]; |
24 | | - // Removing from observer |
25 | | - var index = this.objects.indexOf(object); // using for .destroy() |
26 | | - if (index > -1) |
27 | | - this.objects.splice(index,1); // using for .destroy() |
| 22 | + |
| 23 | + if (data_path[path_id] === undefined) |
| 24 | + data_path[path_id] = {}; |
| 25 | + |
| 26 | + if (data_path[path_id][type] === undefined) |
| 27 | + data_path[path_id][type] = {}; |
| 28 | + |
| 29 | + data_path[path_id][type][this.id] = true; |
| 30 | + this[type][path_id] = true; |
28 | 31 | }; |
29 | 32 |
|
30 | 33 |
|
| 34 | +dop.core.observer.prototype.unobserve = function(object, property) { |
| 35 | + dop.util.invariant(dop.isRegistered(object), 'observer.unobserve needs a registered object as first parameter'); |
| 36 | + |
| 37 | + var path_id = dop.core.getPathId(dop.getObjectPath(object, false)), |
| 38 | + data_path = dop.data.path, |
| 39 | + type = 'observers'; |
31 | 40 |
|
32 | | -dop.core.observer.prototype.observeProperty = function(object, property) { |
33 | | - dop.util.invariant(dop.isRegistered(object), 'observer.observeProperty needs a registered object as first parameter'); |
34 | | - // Storing in object |
35 | | - var object_dop = dop.getObjectDop(object); |
36 | | - if (object_dop.omp[property] === undefined) |
37 | | - object_dop.omp[property] = {}; |
38 | | - if (object_dop.omp[property][this.id] === undefined) { |
39 | | - object_dop.omp[property][this.id] = true; |
40 | | - // Storing in observer |
41 | | - if (this.properties[property] === undefined) |
42 | | - this.properties[property] = []; |
43 | | - this.properties[property].push(object); // using for .destroy() |
| 41 | + // is observeProperty |
| 42 | + if (arguments.length === 2) { |
| 43 | + type = 'observers_prop'; |
| 44 | + path_id += dop.core.pathSeparator(property); |
44 | 45 | } |
45 | | -}; |
46 | | -dop.core.observer.prototype.unobserveProperty = function(object, property) { |
47 | | - dop.util.invariant(dop.isRegistered(object), 'observer.unobserveProperty needs a registered object as first parameter'); |
48 | | - var object_dop = dop.getObjectDop(object), |
49 | | - properties = this.properties[property], |
50 | | - index; |
51 | | - // Removing from object |
52 | | - if (object_dop.omp[property] !== undefined) |
53 | | - delete object_dop.omp[property][this.id]; |
54 | | - // Removing from observer |
55 | | - if (properties !== undefined) { |
56 | | - index = properties.indexOf(object); // using for .destroy() |
57 | | - if (index > -1) |
58 | | - properties.splice(index,1); // using for .destroy() |
| 46 | + |
| 47 | + if (data_path[path_id] !== undefined && data_path[path_id][type] !== undefined) { |
| 48 | + delete data_path[path_id][type][this.id]; |
| 49 | + delete this[type][path_id]; |
59 | 50 | } |
60 | 51 | }; |
61 | 52 |
|
62 | 53 |
|
63 | 54 | dop.core.observer.prototype.destroy = function() { |
64 | | - var index=0, |
65 | | - objectsandproperties = this.objects, |
66 | | - total=objectsandproperties.length, |
67 | | - property; |
68 | | - |
69 | | - // Deleting objects |
70 | | - for (;index<total; ++index) |
71 | | - delete dop.getObjectDop(objectsandproperties[index]).om[this.id]; |
| 55 | + var path_id, |
| 56 | + data_path = dop.data.path; |
| 57 | + |
| 58 | + delete dop.data.observers[this.id]; |
72 | 59 |
|
73 | | - // Deleting properties |
74 | | - objectsandproperties = this.properties; |
75 | | - for (property in objectsandproperties) |
76 | | - for (index=0,total=objectsandproperties[property].length; index<total; ++index) |
77 | | - delete dop.getObjectDop(objectsandproperties[property][index]).omp[property][this.id]; |
| 60 | + for (path_id in this.observers) |
| 61 | + delete data_path[path_id].observers[this.id]; |
78 | 62 |
|
79 | | - // Deleting from dop.data |
80 | | - delete dop.data.observers[this.id]; |
| 63 | + for (path_id in this.observers_prop) |
| 64 | + delete data_path[path_id].observers_prop[this.id]; |
81 | 65 | }; |
82 | 66 |
|
0 commit comments