Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

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していくとか。
まあこの辺もニーズ次第で。
うくく。