-
Notifications
You must be signed in to change notification settings - Fork 2
/
Observable.js
142 lines (111 loc) · 3.93 KB
/
Observable.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/**
* Observable abstract realization
*
* Accept as observers regular function and objects with method "update"
*
* @author Andrew Tereshko <[email protected]>
* @version 0.3.0
*/
define( function () {
"use strict";
/**
* @class app.Observable
*/
$.Class.extend("app.Observable",
/* @prototype */
{
/**
* Set of attached observers by event
*/
_attachedObservers: {},
/**
* Attaches observer function to object
*
* @example attach observer on specific object event
* app.Observable.attachObserver( "event", function(){ } );
*
* @example attach observer on all object events
* app.Observable.attachObserver( function( e ){ alert(e) } );
*
* @param event
* @param observer
*/
attachObserver: function( event, observer ){
if( arguments.length < 2 )
{
observer = event;
event = "**WILDCARD**";
}
if( !(observer instanceof Object) && !(observer instanceof Function) ) {
return;
}
if( !this._attachedObservers[ event ] ) this._attachedObservers[ event ] = [];
this._attachedObservers[ event ].push( observer );
},
/**
* Detach observer function from object
*
* @example detach observer by specific object event
* var foo = function (){};
*
* app.Observable.detachObserver( "event", foo );
*
* @example detach observer from all | any object events
* var foo = function (){};
*
* app.Observable.detachObserver( foo );
*
* @param event
* @param observer
*/
detachObserver: function( event, observer ){
if( arguments.length < 2 )
{
observer = event;
event = null;
}
for( var e in this._attachedObservers ){
if( event !== null && e !== event ) continue;
var oLen = this._attachedObservers[ e ].length;
while( oLen-- ){
if( this._attachedObservers[ e ][ oLen ] === observer ){
this._attachedObservers[ e ].splice( oLen, 1 );
}
}
}
},
/**
* Notifies attached observers about some event
*
* @param event
*/
notify: function( event ){
if( !this._attachedObservers[ event ] || !this._attachedObservers[ event ].length ) {
return;
}
// Iterate over specific bindins
var oLen = this._attachedObservers[ event ].length;
while( oLen-- ){
this._notifyObserver( event, this._attachedObservers[i] );
}
// and don't forget observers that was applied to wildcard
oLen = this._attachedObservers[ '**WILDCARD**' ].length;
while( oLen-- ){
this._notifyObserver( event, this._attachedObservers[i] );
}
},
/**
* @private
* @param event
* @param observer
*/
_notifyObserver: function( event, observer ){
if( observer instanceof Function ){
observer( event, this );
}
else if( observer.update instanceof Function ){
observer.update( event, this );
}
}
});
});