Kumuでの依存解決方法のついでにinjection 案3
user.jsでdepndのメソッドを指定すんのも省略できるかなあ?
命名でinjectしてみる。
depend.js
どうも書き方によってXXXらしいのでこの書き方に変更。
depend = { add:function(x,y){ return x+y; } };
正しくprorpertyですよと認識しもらう。
user.js
これも書き方がー。
正しくprorpertyですよと認識しもらう。
// //import library sample // //@import depend usr = { add:false };
注目すべきはaddというpropertyがfalseである事。
import.js
読み込んだscriptのpropertyをキャッシュしてinjectすべし!injectすべし!
名前空間でキャッシュをわけていないのでアレですけど。
if (typeof(Kumu.Loader) == 'undefined') { Kumu.Loader = {}; }; Kumu.Loader = Kumu.extend(Kumu.Loader, { repository:['/teeda-example/js/'], addRepository : function(o){ repository.push(o); }, _cache:false, importLib : function(lib){ var axo = new Array( "Microsoft.XMLHTTP", "Msxml2.XMLHTTP.4.0", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP" ); var loadfile = function (filename){ var xmlHttp = false; /*@cc_on @if (@_jscript_version >= 5) for (var i = 0; !xmlHttp && i < axo.length; i++) { try { xmlHttp = new ActiveXObject(axo[i]); } catch(e) { } } @else xmlHttp = false; @end @*/ if (!xmlHttp && typeof XMLHttpRequest != "undefined") { try{ // for Firefox, safari xmlHttp = new XMLHttpRequest(); //xmlHttp.overrideMimeType("text/xml"); } catch(e) { xmlHttp = false; } } xmlHttp.open("GET", filename, false); xmlHttp.send(null); return xmlHttp.responseText; }; if(lib){ var arry = this.repository; for(var i = 0; i < arry.length; i++){ var libpath = arry[i]; var fullpath = libpath + lib.replace(/\./,"/") + ".js"; var text = loadfile(fullpath); var result = text.match(/@import [a-z]+/); if(result){ for(var i = 0;i < result.length;i++){ var imports = result[i]; imports = imports.split(' '); if(imports[1]){ Kumu.Loader.importLib(imports[1]); } } } var obj = eval(text); if(!Kumu.Loader._cache){ Kumu.Loader._cache = {}; } var cache = Kumu.Loader._cache; for(var t in obj){ if(t in cache){ obj[t] = cache[t]; } } for(var o in obj){ cache[o] = obj[o]; } } } } });
といっても汚いね。
まーこの辺はご愛嬌。
名前が一致すればpropertyを置き換える事でinject。
injectというか基本的にはdelegateって感じかなあ。
html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>KumuImportTest</title> <script language="JavaScript" type="text/javascript" src="../js/kumu.js"></script> <script language="JavaScript" type="text/javascript" src="../js/src/import.js"></script> <script language="JavaScript" type="text/javascript"> Kumu.Loader.importLib('user'); </script> </head> <body> <input type="button" name="test" value="計算" onclick="alert(usr.add(1,2));"> </body> </html>
user.addはfalseであったにも関わらず呼べてます。
ここまでやる必要があるか?って話もあるけど。
あの手で
//@autoregist *add
をやった時だけ一致したpropertyをinjectしていくとか。
まあこの辺もニーズ次第で。
うくく。