root / trunk / web / dojo / dojox / lang / observable.js @ 10
History | View | Annotate | Download (3.57 KB)
1 |
/*
|
---|---|
2 |
Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
3 |
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
4 |
see: http://dojotoolkit.org/license for details
|
5 |
*/
|
6 |
|
7 |
|
8 |
if(!dojo._hasResource["dojox.lang.observable"]){ |
9 |
dojo._hasResource["dojox.lang.observable"]=true; |
10 |
dojo.provide("dojox.lang.observable");
|
11 |
dojo.experimental("dojox.lang.observable");
|
12 |
dojox.lang.observable=function(_1,_2,_3,_4){ |
13 |
return dojox.lang.makeObservable(_2,_3,_4)(_1);
|
14 |
}; |
15 |
dojox.lang.makeObservable=function(_5,_6,_7,_8){ |
16 |
_8=_8||{}; |
17 |
_7=_7||function(_9,_a,_b,_c){
|
18 |
return _a[_b].apply(_9,_c);
|
19 |
}; |
20 |
function _d(_e,_f,i){ |
21 |
return function(){ |
22 |
return _7(_e,_f,i,arguments); |
23 |
}; |
24 |
}; |
25 |
if(dojox.lang.lettableWin){
|
26 |
var _10=dojox.lang.makeObservable;
|
27 |
_10.inc=(_10.inc||0)+1; |
28 |
var _11="gettable_"+_10.inc; |
29 |
dojox.lang.lettableWin[_11]=_5; |
30 |
var _12="settable_"+_10.inc; |
31 |
dojox.lang.lettableWin[_12]=_6; |
32 |
var _13={};
|
33 |
return function(_14){ |
34 |
if(_14.__observable){
|
35 |
return _14.__observable;
|
36 |
} |
37 |
if(_14.data__){
|
38 |
throw new Error("Can wrap an object that is already wrapped"); |
39 |
} |
40 |
var _15=[],i,l;
|
41 |
for(i in _8){ |
42 |
_15.push(i); |
43 |
} |
44 |
var _16={type:1,event:1}; |
45 |
for(i in _14){ |
46 |
if(i.match(/^[a-zA-Z][\w\$_]*$/)&&!(i in _8)&&!(i in _16)){ |
47 |
_15.push(i); |
48 |
} |
49 |
} |
50 |
var _17=_15.join(","); |
51 |
var _18,_19=_13[_17];
|
52 |
if(!_19){
|
53 |
var _1a="dj_lettable_"+(_10.inc++); |
54 |
var _1b=_1a+"_dj_getter"; |
55 |
var _1c=["Class "+_1a,"\tPublic data__"]; |
56 |
for(i=0,l=_15.length;i<l;i++){ |
57 |
_18=_15[i]; |
58 |
var _1d=typeof _14[_18]; |
59 |
if(_1d=="function"||_8[_18]){ |
60 |
_1c.push(" Public "+_18);
|
61 |
}else{
|
62 |
if(_1d!="object"){ |
63 |
_1c.push("\tPublic Property Let "+_18+"(val)","\t\tCall "+_12+"(me.data__,\""+_18+"\",val)","\tEnd Property","\tPublic Property Get "+_18,"\t\t"+_18+" = "+_11+"(me.data__,\""+_18+"\")","\tEnd Property"); |
64 |
} |
65 |
} |
66 |
} |
67 |
_1c.push("End Class");
|
68 |
_1c.push("Function "+_1b+"()","\tDim tmp","\tSet tmp = New "+_1a,"\tSet "+_1b+" = tmp","End Function"); |
69 |
dojox.lang.lettableWin.vbEval(_1c.join("\n"));
|
70 |
_13[_17]=_19=function(){ |
71 |
return dojox.lang.lettableWin.construct(_1b);
|
72 |
}; |
73 |
} |
74 |
var _1e=_19();
|
75 |
_1e.data__=_14; |
76 |
try{
|
77 |
_14.__observable=_1e; |
78 |
} |
79 |
catch(e){
|
80 |
} |
81 |
for(i=0,l=_15.length;i<l;i++){ |
82 |
_18=_15[i]; |
83 |
try{
|
84 |
var val=_14[_18];
|
85 |
} |
86 |
catch(e){
|
87 |
} |
88 |
if(typeof val=="function"||_8[_18]){ |
89 |
_1e[_18]=_d(_1e,_14,_18); |
90 |
} |
91 |
} |
92 |
return _1e;
|
93 |
}; |
94 |
}else{
|
95 |
return function(_1f){ |
96 |
if(_1f.__observable){
|
97 |
return _1f.__observable;
|
98 |
} |
99 |
var _20=_1f instanceof Array?[]:{}; |
100 |
_20.data__=_1f; |
101 |
for(var i in _1f){ |
102 |
if(i.charAt(0)!="_"){ |
103 |
if(typeof _1f[i]=="function"){ |
104 |
_20[i]=_d(_20,_1f,i); |
105 |
}else{
|
106 |
if(typeof _1f[i]!="object"){ |
107 |
(function(i){
|
108 |
_20.__defineGetter__(i,function(){
|
109 |
return _5(_1f,i);
|
110 |
}); |
111 |
_20.__defineSetter__(i,function(_21){
|
112 |
return _6(_1f,i,_21);
|
113 |
}); |
114 |
})(i); |
115 |
} |
116 |
} |
117 |
} |
118 |
} |
119 |
for(i in _8){ |
120 |
_20[i]=_d(_20,_1f,i); |
121 |
} |
122 |
_1f.__observable=_20; |
123 |
return _20;
|
124 |
}; |
125 |
} |
126 |
}; |
127 |
if(!{}.__defineGetter__){
|
128 |
if(dojo.isIE){
|
129 |
var frame;
|
130 |
if(document.body){
|
131 |
frame=document.createElement("iframe");
|
132 |
document.body.appendChild(frame); |
133 |
}else{
|
134 |
document.write("<iframe id='dj_vb_eval_frame'></iframe>");
|
135 |
frame=document.getElementById("dj_vb_eval_frame");
|
136 |
} |
137 |
frame.style.display="none";
|
138 |
var doc=frame.contentWindow.document;
|
139 |
dojox.lang.lettableWin=frame.contentWindow; |
140 |
doc.write("<html><head><script language=\"VBScript\" type=\"text/VBScript\">"+"Function vb_global_eval(code)"+"ExecuteGlobal(code)"+"End Function"+"</script>"+"<script type=\"text/javascript\">"+"function vbEval(code){ \n"+"return vb_global_eval(code);"+"}"+"function construct(name){ \n"+"return window[name]();"+"}"+"</script>"+"</head><body>vb-eval</body></html>"); |
141 |
doc.close(); |
142 |
}else{
|
143 |
throw new Error("This browser does not support getters and setters"); |
144 |
} |
145 |
} |
146 |
dojox.lang.ReadOnlyProxy=dojox.lang.makeObservable(function(obj,i){
|
147 |
return obj[i];
|
148 |
},function(obj,i,_22){
|
149 |
}); |
150 |
} |