çŽ æŽããããµã€ã
http://todomvc.com/ããããŸããããã¯ãç°ãªãJavaScript MV *ïŒ
Model-View- [Controller] ïŒãã¬ãŒã ã¯ãŒã¯ã䜿çšããåãåé¡ã®è§£æ±ºçã瀺ããŠããŸãã çŸåšãããŸããŸãªãã¬ãŒã ã¯ãŒã¯ããããããããã«é·æãšçæããããŸãã
Angular ã
Ember ã
Backboneãªã©ã®å·šäººãã
ãŸã ã 競äºãæ¿ããã«ãããããããMV *ãã¬ãŒã ã¯ãŒã¯
jWidgetã®ãã¢ãåŒãç¶ãè¡ããããš
æããŸãã
TodoMVC Webãµã€ãã«ãããã¹ãŠã®ãœãªã¥ãŒã·ã§ã³ããã°ãã調ã¹ããšãããjWidgetã«äŒŒããã¬ãŒã ã¯ãŒã¯ã¯1ã€ãèŠã€ãããŸããã§ããã å®éãJavaScriptã«å ããŠãJavaãCïŒãªã©ã®ãªããžã§ã¯ãæåããã°ã©ãã³ã°èšèªã§ããã°ã©ãã³ã°ãè¡ã£ãŠããŸãããŸããéå»ã«ã¯C ++ã§ããã°ã©ãã³ã°ãè¡ã£ãŠããŸãã ãããã£ãŠãç§ã¯ãªããžã§ã¯ãæåããã°ã©ãã³ã°ã
åºãåå ã
ãªããžã§ã¯ãæåèšèšã®ãã¿ãŒã³ã®å€§ãã¡ã³ã§ãã æšæºã®ãªããžã§ã¯ãæåãœãªã¥ãŒã·ã§ã³ã䜿çšããå¯èœæ§ãå¶éãããã¬ãŒã ã¯ãŒã¯ã¯å¿
èŠãããŸããã æ¢åã®TodoMVCãœãªã¥ãŒã·ã§ã³ã§ç§ãèŠããã®ã¯ããã®ç¹ã§èªä¿¡ãåŒã³èµ·ãããã®ã§ã¯ãããŸããã ååãšããŠããããã¯ããã€ãã®å®£èšæ§æãšåŒ·åãªãã³ãã¬ãŒããšã³ãžã³ãæäŸããŸãããããããã¹ãŠã®ãªããžã§ã¯ãæåã®åºç€ã¯ãããšãååšããŠããç§ãã¡ã®ç®ã«ã¯èŠããŸããã
è±èªã®ããã¥ã¡ã³ãïŒ http : //enepomnyaschih.imtqy.com/jwidget/index.html#! / guide / homeãã·ã¢èªã®ããã¥ã¡ã³ãïŒ http : //enepomnyaschih.imtqy.com/jwidget/index.html#! / guide / ruhomeGitHubãããžã§ã¯ãïŒ https : //github.com/enepomnyaschih/jwidgetTwitterïŒ @jwidgetprojectjWidgetã§ã®TodoMVCå®è£
ïŒ http ://enepomnyaschih.imtqy.com/todomvc/labs/architecture-examples/jwidget/release/jWidgetã¯ç§ã®ãã©ãŒã¯ã«ããååšããªããããSourceãªã³ã¯ã¯ä»ã¯åäœããŸããã 以äžã¯ããœãŒã¹ã³ãŒããžã®æ£ãããªã³ã¯ã§ãã
JWidgetãœãŒã¹ã³ãŒãTodoMVCïŒ https : //github.com/enepomnyaschih/todomvc/tree/gh-pages/labs/architecture-examples/jwidget/jWidgetã®äž»ãªæ©èœãç°¡åã«ãªã¹ãããŸãã
1. OOPã®ååã®å³æ Œãªã³ã³ãã©ã€ã¢ã³ã¹ã ãµã³ãã«ãã¥ãŒããªã¢ã«ãå«ãå®å
šã«ææžåããããã€ãªã³ã¬ã«ã¯ã©ã¹ã©ã€ãã©ãªã
2.äœãããã¹ã¯ãªããã®é床ã ãããã£ãŠãã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒã®æ瀺çãªå®£èšãšãã¯ã©ã¹ã宣èšãããšãã®ã¯ããŒãžã£ãŒã®æå°éã®äœ¿çšã¯ã Google Chromeã§ã¯ããããã¿ã€ãã«ããç¶æ¿ã¯ããã¢ãžã¥ãŒã«ããã¿ãŒã³ã«ããç¶æ¿
ãããã¯ããã«å¹ççã§ã ïŒFirefoxã§ã¯ãéãã¯ããã»ã©å€§ãããããŸããïŒã
3.ã¢ãã«ãæäœããããã«ããã¥ãŒãå®å
šã«åã¬ã³ããªã³ã°ããå¿
èŠã¯ãããŸããã åã³ã³ããŒãã³ãã¯äžåºŠã ãã¬ã³ããªã³ã°ããããã®åŸã¯åã
ã®èŠçŽ ã®ã¿ãæŽæ°ãããããã¢ããªã±ãŒã·ã§ã³ã®é«éæ§ãä¿èšŒãããŸãã
4.ãã¬ãŒã ã¯ãŒã¯ã¯
jQueryã§å®è¡ãããŸãã
5.é¢æ°
https://api.jquery.com/jQuery.parseHTML/ã«éä¿¡ãããåã«ååŠçãå¿
èŠãšããªãæãåçŽãªãã³ãã¬ãŒããšã³ãžã³ããã
ãŸã ã ãã³ãã¬ãŒãã«ã¯éæ³ãã€ã³ã©ã€ã³ã³ãŒãããããŸããããã¹ãŠã®ããŒã¿ãã€ã³ãã£ã³ã°ã¯ã³ã³ããŒãã³ãã®JavaScriptã³ãŒãã§å®è£
ãããŸãã ãã®ããããã¥ãŒãã¢ãã«ã«ãªã³ã¯ããå Žåãšãã¢ãã«å
ãŸãã¯ãã¥ãŒå
ã®ãªããžã§ã¯ãããªã³ã¯ããå Žåã®äž¡æ¹ã§ãåãããŒã¿ãã€ã³ãã£ã³ã°ææ³ã䜿çšã§ããŸããããã¯å€ãã®å Žå䟿å©ã§ãã
6.䜿çšåŸã®ãã¹ãŠã®ãªããžã§ã¯ãã¯å®å
šã«ç Žå£ãããŸãã ããã«ãããè²»çšå¯Ÿå¹æã®é«ã顧客ãªãœãŒã¹ã®æ¶è²»ãšãäœããã®ã€ãã³ããåŠçããããšããããããããªããžã§ã¯ãã«ããã³ã³ãœãŒã«ã§ã®äºæããªããšã©ãŒããªããªããŸãã ããšãã°ãã¢ããªã±ãŒã·ã§ã³ã®äœæ¥å
šäœã§åãã¢ãã«ã䜿çšããŠããã®ãã¬ãŒã³ããŒã·ã§ã³ããªã³ã¶ãã©ã€ã§å€æŽã§ããŸãã ãã¥ãŒã¯ã¢ãã«ã€ãã³ãããªãã¹ã³ããŸããããã¥ãŒãDOMããåé€ãããåŸããããã®ã€ãã³ããåŠçããããã»ããµæéãç¡é§ã«ããªãããã«ãããã®ã€ãã³ãã®ãµãã¹ã¯ã©ã€ãã解é€ããã¬ããŒãžã³ã¬ã¯ã¿ãŒãã¡ã¢ãªãã¯ãªã¢ã§ããããã«ããå¿
èŠããããŸãã ãªããžã§ã¯ããç Žå£ããç°¡åãªæ¹æ³ããããŸã-ããããã ãªããžã§ã¯ãã®éçŽã®ã¡ã«ããºã ã
7.ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³
ãã«ããŒã§ããjWidget SDK㯠ãã¢ããªã±ãŒã·ã§ã³éçºãç°¡çŽ åã
ãæ¬çªç°å¢ã«ãªãªãŒã¹ããåã«ã³ãŒããæé©åããŸãã ããã
GruntJSã®ãã©ã°ã€ã³ã®ã¹ã¿ãã¯ã«çœ®ãæããäºå®
ã§ã ã ç§ãjWidgetãGruntJSãªã©ã®éçºãå§ãããšããããã¯ååšããŸããã§ããã
jWidgetãéåžžã«é«éã§ããããšã確èªããããã«ããã©ãŠã¶ãŒã«ãã¥ãŒãåæç»ããæéãäžããããã«åãšã³ããªãè¿œå ããåŸã0ããªç§ã®åŸ
æ©ã§TodoMVCã«500ãšã³ããªãè¿œå ããã®ã«ããã£ãæéã枬å®ããŸããã ãŸãã500ã¬ã³ãŒãã®[ãã¹ãŠéžæ]ããã³[å®äºããæäœãã¯ãªã¢]ã®æéã倧ãŸãã«æž¬å®ããŸããã çµæã¯æ¬¡ã®ãšããã§ãã
- è§åºŠJS -16847ããªç§ã ãã¹ãŠãéžæãããšãå®äºããæäœã¯ããã«ã¯ãªã¢ãããŸãã
- Angular JS ïŒããã©ãŒãã³ã¹æé©åããŒãžã§ã³ïŒ-13287ããªç§ã ãã¹ãŠãéžæãããšãå®äºããæäœã¯ããã«ã¯ãªã¢ãããŸãã
- Ember JS -13095ããªç§ã ãã¹ãŠãéžæããå®äºããæäœãã¯ãªã¢ããã«ã¯çŽ3ç§ããããŸãã
- ããã¯ããŒã³ -9506ããªç§ã ãã¹ãŠãéžæããå®äºããæäœãã¯ãªã¢ããã«ã¯çŽ3ç§ããããŸãã
- jWidget -9974ããªç§ã ãã¹ãŠãéžæãããšãå®äºããæäœã¯ããã«ã¯ãªã¢ãããŸãã
- YUI -1å以äžã åŸ
ããªãã£ãã
ã芧ã®ãšãããã¬ã³ãŒãã®è¿œå é床ã¯Backboneã®ã¿ãjWidgetããããã«äžåã£ãŠããŸããããåæã«Select AllãšClear Completeã®é床ãé
ããŠããŸããã åæã«ãAngularãšEmberã®3ç§ã®é
ãã¯å®éã«ã¯éèŠã§ããããšã«æ³šæããŠãã ããããã¹ãŠã®å Žåã«ãããŠãsetTimeoutã®500åã®åŒã³åºãã«ãã£ãŠå€ãã®æéãåã«æ¶è²»ãããããã§ãã äžè¬ã«ã3ã€ã®æã人æ°ã®ãããã¬ãŒã ã¯ãŒã¯ã®ãã¡ãã©ããæåŸãŸã§å€§éã®ããŒã¿ã«å¯ŸåŠããããšãã§ããŸããã§ããããjWidgetããããã§ããããšãå€æããŸããã
次ã«ãjWidgetã®ã¡ã«ããºã ã«ã€ããŠèª¬æããŸãã ãã¬ãŒã ã¯ãŒã¯ã¯5ã€ã®å±€ã§æ§æãããŸãã
- ã¯ã©ã¹ãšãªããžã§ã¯ã ã ã¯ã©ã¹ã®ç¶æ¿ã ãªããžã§ã¯ãã®éçŽã®ã¡ã«ããºã ã
- ã€ãã³ã ã€ãã³ãã®çºè¡šã ãµãã¹ã¯ãªãã·ã§ã³ããµãã¹ã¯ã©ã€ã解é€ãã€ãã³ãçæã
- ããããã£ãšãã®ãã«ã㌠ã æ¢åã®ããããã£ã«åºã¥ããŠæ°ããããããã£ãäœæããŸãã ããããã£ããŒã¹ã®ããŒã¿ãã€ã³ãã£ã³ã°ã
- ã³ã¬ã¯ã·ã§ã³ãšãã®ã·ã³ã¯ããã€ã¶ãŒ ã é
åãèŸæžãå€ãã æ¢åã®ã³ã¬ã¯ã·ã§ã³ã«åºã¥ããæ°ããã³ã¬ã¯ã·ã§ã³ã®äœæã ã³ã¬ã¯ã·ã§ã³ããŒã¹ã®ããŒã¿ãã€ã³ãã£ã³ã°ã
- ã³ã³ããŒãã³ã ã ãã³ãã¬ãŒãã ãã³ãã¬ãŒãèŠçŽ ãšã³ã³ããŒãã³ãã³ãŒãã®é¢ä¿ã ããããã£ãšã³ã¬ã¯ã·ã§ã³ã«åºã¥ãããŒã¿ãã€ã³ãã£ã³ã°ã䜿çšããŠåã³ã³ããŒãã³ããäœæããŸãã
1.ã¯ã©ã¹ãšãªããžã§ã¯ãã
以äžã¯ãjWidgetã¯ã©ã¹ã®å®£èšã®äŸã§ãã ã¯ã©ã¹ã¯ãå°éã®æ§æç³ã§åžéããããããã¿ã€ããä»ããæšæºç¶æ¿ã«ãã£ãŠäœæãããŸãã
JW.Classã®äž»èŠãªæ©èœã®1ã€ã¯ãå¥ã®ãªããžã§ã¯ãã®å¶åŸ¡äžã«ãããªããžã§ã¯ããç Žæ£ãããªããžã§ã¯ãéçŽã¡ã«ããºã ã§ãã ãã®ã¢ã€ãã¢ã¯ã
ããªããžã§ã¯ãæåèšèšã®ããªãã¯ããšããæ¬ã®çŽ¹ä»ããåŸããã®
ã§ãã ã®ã£ã³ã°ãªããã©ãŒã®
ãã¶ã€ã³ãã¿ãŒã³ ã ãªããžã§ã¯ããžã®ãã¹ãŠã®ãã€ã³ã¿ãŒã¯ãéçŽãšèªèã®2ã€ã®ã¿ã€ãã«åããããããšãããããŸãã èªèãšã¯ããã€ã³ã¿ãŒãææãããªããžã§ã¯ããããã®ãã€ã³ã¿ãŒãåç
§ãããªããžã§ã¯ãã«å¯ŸããŠäžåã®è²¬ä»»ãè² ããªãããšãæå³ããŸãã 圌ã¯åã«èªåã®ãããªãã¯ãã£ãŒã«ããšã¡ãœããã«ã¢ã¯ã»ã¹ã§ããŸããããã®ãªããžã§ã¯ãã®æå¹æéã¯åœŒã®å¶åŸ¡äžã«ã¯ãããŸããã ãã ããéçŽãšã¯ããªã³ã¯ãææãããªããžã§ã¯ããããã®ãªã³ã¯ãåç
§ãããªããžã§ã¯ããç Žæ£ãã責任ãããããšãæå³ããŸãã ååãšããŠãããè€éãªã±ãŒã¹ããããŸãããéçŽãªããžã§ã¯ãã¯ææè
ãªããžã§ã¯ããçããŠããéãåç¶ããŸãã
jWidgetã§ã¯ãéçŽã¯
JW.Classã¯ã©ã¹ã®
ç¬èªã®ã¡ãœãããä»ããŠå®è£
ãããŸãã ãªããžã§ã¯ãBããªããžã§ã¯ãAã®ç¬èªã®ã¡ãœããã«æž¡ãããšã«ããããªããžã§ã¯ãAããªããžã§ã¯ãBã®ææè
ã«ããŸããããªããžã§ã¯ãAãç Žæ£ãããšããªããžã§ã¯ãBã¯èªåçã«ç Žæ£ãããŸãã 䟿å®äžãç¬èªã®ã¡ãœããã¯ãªããžã§ã¯ãBãè¿ããŸãã以äžã¯ããã®æ©èœã䜿çšããã³ãŒãã®äŸã§ãã
var Soldier = function() { Soldier._super.call(this);
ããã§ã
destroyã¡ãœãããåŒã³åºããŠå
µå£«ãäœæããç Žå£ã§ããŸãã
var soldier = new Soldier(); soldier.destroy();
ãã®çµæããã©ãŠã¶ã³ã³ãœãŒã«ã«æ¬¡ã®è¡ã衚瀺ãããŸãã
ç Žå£å
µå£«
å³æãç Žå£ãã
å·Šæãç Žå£ãã
ã芧ã®ãšãããå
µå£«ãç Žå£ããããšãå
µå£«ã®æã¯èªåçã«ç Žå£ãããŸãã ãããã¯ãdestroyã¡ãœãããåŒã³åºãããšã«ãããSoldierã¯ã©ã¹ã®destroyã¡ãœããã§æ瀺çã«æãç Žå£ããããšãã§ããŸãã ããããéçŽã«ãããããå°ãªãã³ãŒãã§ãããå®çŸã§ããŸãã äžè¬ã«ãå®éã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãdestroyã¡ãœããããªãŒããŒããŒãããããšã¯ã»ãšãã©ãããŸããã ããšãã°ã
ç§ã®TodoMVCå®è£
ã§ã¯
ããã®ã¡ãœããã¯äžåºŠããªãŒããŒããŒããããŸãã-ãªããžã§ã¯ãã®éçŽã®1ã€ã®ã¡ã«ããºã ã«ãã£ãŠãã¹ãŠãéæãããŸãã
éçŽããããªããžã§ã¯ãã¯éã®é åºã§ç Žæ£ãããŸããããã«ããããªããžã§ã¯ãéã®é¢ä¿ãããå Žåã®æŽåæ§ãä¿èšŒãããŸãã
2.ã€ãã³ãã
ã€ãã³ãã¯ãMV *ãã¬ãŒã ã¯ãŒã¯ã®äžå¯æ¬ ãªéšåã§ãã ãã¥ãŒãã¢ãã«ã«çŽæ¥ã¢ã¯ã»ã¹ã§ããå Žåãã¢ãã«ã¯ãã¥ãŒã«ã€ããŠäœãç¥ããŸããã ãã£ãŒãããã¯ã¯ãã€ãã³ããéããŠã®ã¿è¡ãããŸãã
ã¯ãªã㯠ã
ããŠã¹ããŠã³ã ããŒæŒäžãªã©ã®æšæºã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã€ãã³ããæå³ããã®ã§ã¯ãªãã
ã ããã¥ã¡ã³ãã®ååãå€æŽãããŸããã ã
ãæ°ããããã¥ã¡ã³ãããã©ã«ããŒã«è¿œå ãããŸããã ã
ããã©ã«ããŒå
ã®ããã¥ã¡ã³ããæ¥ä»é ã«ãœãŒããããŸãããªã©ã®ã€ãã³ãã§ãã ããã¯ãããã°ã©ãã³ã°èšèªã®æšæºããŒã«ã«ã¯å«ãŸããŠããªãããããã¬ãŒã ã¯ãŒã¯ã®ã¿ã¹ã¯ã§ãã
èšäºã®åé ã§æžããããã«ãjWidgetã®ã¹ã¯ãªããã®é床ã¯äœãããåªããŠããŸãã ãããã£ãŠãããšãã°jQueryã§ææ¡ãããŠããæšæºã®ã€ãã³ããµãã¹ã¯ãªãã·ã§ã³ã¹ããŒã ã¯ãç§ãã¡ã«ã¯é©ããŠããŸããã
$("#document").bind("click", onClick); $("#document").unbind("click", onClick);
ããã§ã®åé¡ã¯ãã€ãã³ãå¿çã¢ã«ãŽãªãºã ãç·åœ¢èšç®ã®è€éããæã£ãŠããããšã§ãïŒåŸ¹åºçãªæ€çŽ¢ïŒã ã€ãã³ãããã®ãµãã¹ã¯ã©ã€ã解é€æéããããŒããã£ã¯ã·ã§ããªããåé€ãããæéã«çãããã¯ããã«é«éãªã¹ããŒã ãå®è£
ã§ããŸããã ããã«ãjWidgetã€ãã³ãã¹ããŒã ã¯ãOOPã®ãã¹ãŠã®ååã«åŸã£ãŠå®è£
ããããªããžã§ã¯ãã®éçŽã¡ã«ããºã ãšå®å
šã«çµåããŸãã
var Document = function(title) { Document._super.call(this); this.title = title;
ã€ãã³ãã¯
JW.Eventã¯ã©ã¹ã«ãã£ãŠè¡šãããŸãã ã€ãã³ããµãã¹ã¯ãªãã·ã§ã³ã¯ã
JW.EventAttachmentã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãšããŠ
bindã¡ãœããã«ãã£ãŠè¿ãããŸãã ãµãã¹ã¯ãªãã·ã§ã³ãç Žæ£ããããšã¯ãã€ãã³ããããµãã¹ã¯ãªãã·ã§ã³ã解é€ããããšãšåãã§ãã
ããªã¬ãŒã¡ãœããã䜿çšããŠã€ãã³ããã¹ããŒããå Žåã
JW.EventParamsã®ã€ã³ã¹ã¿ã³ã¹ã
ããã«æž¡ããŠãã€ãã³ããã³ãã©ãŒã«åŒæ°ãšããŠæž¡ããŸãã
3.ããããã£ãšãã®ãã«ããŒ
ãã¬ãŒã ã¯ãŒã¯ã¯ãããŒã¿ãã€ã³ãã£ã³ã°ã®å¯èœæ§ãæäŸããªãå Žåãæ¬æ ŒçãªMV *ãã¬ãŒã ã¯ãŒã¯ãšåŒã¶ããšã¯ã§ããŸããã jWidgetã¯ãã®æ©èœãæäŸããŸãã 次ã®ã¯ã©ã¹ã®ãªããžã§ã¯ãã¯ãå€æŽã«é¢ããã€ãã³ããèªåçã«ã¹ããŒãããããããŒã¿ãã€ã³ãã£ã³ã°ã«äœ¿çšã§ããŸãã
次ã®æ®µèœã§ã³ã¬ã¯ã·ã§ã³ïŒé
åãããããã»ããïŒã«ã€ããŠèª¬æããŸãã
次㫠ãããããã£ïŒ
JW.Property ïŒã«ã€ããŠèª¬æããŸãã
ããããã£ã¯ãå€ã®å€æŽã«é¢ããã€ãã³ããã¹ããŒãããå€æ°ãã§ãã ãããã£ãŠããã®ã¯ã©ã¹ã®æãåçŽãªã€ã³ã¿ãŒãã§ãŒã¹ïŒ
xã®å€ãsetã¡ãœããã«æž¡ããšãããããã£ã¯xã®å€ãšçãããã©ããã確èªããŸãã çããå Žåãäœãèµ·ãããŸããã çãããªãå Žåãããããã£ã¯èªèº«ãxã«èšå®ããchangeEventã€ãã³ããã¹ããŒããŸãã
ã¯ã©ã¹ã€ã³ã¿ãŒãã§ã€ã¹ã¯èªèã§ããªããšããäºå®ã«ãããããããããŒã¿ãã€ã³ãã£ã³ã°ã«ååãªæ©äŒãæäŸããã¢ããªã±ãŒã·ã§ã³ã³ãŒãã®éã倧å¹
ã«åæžããŸãã ãŸãã1ã€ã®ããããã£ã®å€ãå¥ã®ããããã£ã«ã³ããŒããããšã«ããã2ã€ã®ããããã£ãé¢é£ä»ããããšãã§ããŸãã
var source = new JW.Property("apple"); var target = new JW.Property(); new JW.Copier(source, {target: target}); assertEqual("apple", target.get()); source.set("banana"); assertEqual("banana", target.get());
bindToã¡ãœãããåãããšãè¡ããããã³ãŒããããç解ããããã§ããŸãã ããã«ããã®å Žåã®ã¿ãŒã²ããããããã£ãå€æŽã«é¢ããã€ãã³ããã¹ããŒããããããã§ãŒã³ã«æ²¿ã£ãŠå¥œããªã ãããããã£ãé¢é£ä»ããããšãã§ããããšã«æ³šæããŠãã ããã
var source = new JW.Property("apple"); var target1 = new JW.Property(); target1.bindTo(source); var target2 = new JW.Property(); target2.bindTo(target1); source.set("banana"); assertEqual("banana", target2.get());
ãã®å Žã§ããããã£ãã³ããŒããããšã¯å§ãŸãã«ãããŸããã åŒ
text = value + " " + unit
ã䜿çšããŠã2ã€ã®æ¢åã®ããããã£ã«åºã¥ããŠæ°ããããããã£ãäœæããŠã¿ãŸãããã
var value = new JW.Property(1000); var unit = new JW.Property("MW"); var functor = new JW.Functor([ value, unit ], function(value, unit) { return value + " " + unit; }, this); var target = functor.target; assertEqual("1000 MW", target.get()); value.set(1500); assertEqual("1500 MW", target.get()); unit.set("");
æåŸã«ãäœããã®è¡šçŸèŠçŽ å
ã®ããã¹ããæ§ç¯ãããããããã£ã«ãã€ã³ãããŸãã
new JW.UI.TextUpdater("#capacity", target);
ããã§ãå€ãšåäœãå€æŽãããšãïŒcapacityèŠçŽ å
ã®ããã¹ããèªåçã«æŽæ°ãããŸãã
ããã¥ã¡ã³ãã® JW.Propertyã¯ã©ã¹æ©èœã®å®å
šãªãªã¹ããåç
§ããŠãã ããã
jWidgetã¯ãHTMLãã³ãã¬ãŒããä»ãã䜿ãæ
£ããããŒã¿ãã€ã³ãã£ã³ã°ãã¢ããªã±ãŒã·ã§ã³ã®JavaScriptã³ãŒãã«è»¢éããŸãã ããã«ãããã¢ããªã±ãŒã·ã§ã³ãæé©åããæ©èœãæ¡åŒµãã絶奜ã®æ©äŒãæäŸãããŸãã ããŒã¿ãã€ã³ãã£ã³ã°ã¯ãã¢ãã«ãšãã¥ãŒã®éã®ã¬ã€ã€ãŒã ãã«éå®ãããŸããã ã¢ãã«å
ããã³ãã¥ãŒå
ã§ããããã£ãç°¡åã«é¢é£ä»ããããšãã§ããŸãã ã¢ããªã±ãŒã·ã§ã³æäœã¢ã«ãŽãªãºã ã¯å®å
šã«ééçã§ãããã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®äœ¿çšã·ããªãªã«åºã¥ããŠããŠãŒã¶ãŒãèªåãé¢é£ä»ãã察象ãå¶åŸ¡ã§ããŸãã ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®æ©èœãåå©çšã§ããŸãã ãã¬ãŒã ã¯ãŒã¯ã¯ãããããããŒã¿ãã€ã³ãã£ã³ã°ã®åŒãæœåºããããã«HTMLãã³ãã¬ãŒããããªã³ã³ãã€ã«ããŸãããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®é床ãåäžããŸãã
ããããã£ã®å€ã¯ã
ownValueã¡ãœããã䜿çšããŠéèšã§ããŸãã
4.ã³ã¬ã¯ã·ã§ã³ãšã·ã³ã¯ããã€ã¶ãŒ
jWidgetã«ã¯ã
JW.AbstractArray ã
JW.AbstractMap ãããã³
JW.AbstractSetã® 3ã€ã®ç¬èªã®ã³ã¬ã¯ã·ã§ã³ã¯ã©ã¹ãå°å
¥ãããŠããŸãã ããã¯ããã€ãã£ãã®é
åãšãªããžã§ã¯ãã®äœ¿çšãçŠæ¢ãããŠããããšãæå³ãããã®ã§ã¯ãããŸãããjWidgetã³ã¬ã¯ã·ã§ã³ã¯ããã€ãã£ãã«ç°¡åã«å€æã§ããŸãã åjWidgetã³ã¬ã¯ã·ã§ã³ã«ã¯2ã€ã®å®è£
ããããŸã-ã·ã³ãã«ãªå®è£
ãšã¢ã©ãŒããªå®è£
ïŒ
-JW.AbstractArray ïŒ
JW.Arrayããã³
JW.ObservableArray-JW.AbstractMap ïŒ
JW.Mapããã³
JW.ObservableMap-JW.AbstractSet ïŒ
JW.Setããã³
JW.ObservableSetåçŽãªã³ã¬ã¯ã·ã§ã³ã¯éç¥ãããããå°ãéãåäœããŸãããéç¥ããã³ã¬ã¯ã·ã§ã³ã¯å€æŽã«ã€ããŠã€ãã³ããã¹ããŒãããããããŒã¿ãã€ã³ãã£ã³ã°ã¯ãããã«èªç±ã«é©çšãããŸãã ãŸããåçŽãªã³ã¬ã¯ã·ã§ã³ã¯ã©ã¹ã«ã¯ããã€ãã£ãã®ArrayãšObjectã§åãæäœãå®è¡ããããã«èšèšãããåäžã®éçã¡ãœããã®ã»ããããããŸãã äŸãšããŠãã¢ãã«ãªããžã§ã¯ãã®é
åã䜿çšããŠãã¥ãŒãªããžã§ã¯ãã®é
åãäœæããæäœãåŒçšããŸãã
ãã®éãåã«JW.Arrayã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããããã«ãã¥ãŒãªããžã§ã¯ããè¿œå ããŸããã ããã¥ã¡ã³ãé
åãšãã®è¡šçŸã®éã®æ¥ç¶ã¯ä¿æãããŠããªããããããã¥ã¡ã³ãé
åãå€æŽããŠãè¡šçŸã®é
åãå€æŽããå¿
èŠã¯ãããŸããã ãããããªã³ã¯ããã«ã¯ãããŒã¿ãã€ã³ãã£ã³ã°ãæ§æããå¿
èŠããããŸãã jWidgetã§ã¯ãããã¯ã·ã³ã¯ããã€ã¶ãŒãäœæããããšã§è¡ãããŸãã ãã®å Žåã
ããããŒãäœæããå¿
èŠããããŸãã
function createDocumentViews(documents) { return documents.createMapper({ createItem: function(document) { return new DocumentView(document); }, destroyItem: function(documentView) { documentView.destroy(); }, scope: this }).target; }
ã芧ã®ãšããã1ã€ã®ã³ãŒã«ããã¯ã®ä»£ããã«ã2ã€ãæž¡ããŸãã 2çªç®ã®ã³ãŒã«ããã¯ã¯ãããã¥ã¡ã³ãé
åããåé€ãããå Žåã«ããããŒãããã¥ã¡ã³ããã¥ãŒãç Žæ£ã§ããããã«ããããã«å¿
èŠã§ãã ããããŒã¯
ã¿ãŒã²ããã®é
åã圢æããå
ã®é
åãšå®å
šã«äžèŽããããã«ä¿æããŸãã ããããŒãç Žå£ãããšãã¿ãŒã²ããã«æ®ã£ãŠãããã¹ãŠã®è¡šçŸãç Žå£ãããŸã...ãšããã§ãããããŒãç Žå£ããã®ãå¿ããŠããŸããã éèšã䜿çšããŸãã
var DocumentList = function(documents) { DocumentList._super.call(this); this.documentViews = this.createDocumentViews(documents); }; JW.extend(DocumentList, JW.Class, { createDocumentViews: function(documents) { return this.own(documents.createMapper({ createItem: function(document) { return new DocumentView(document); }, destroyItem: function(documentView) { documentView.destroy(); }, scope: this })).target; } });
æ¬åŒ§ã®æå³ã«æ³šæããŠãã ããã ããããŒãæ£ç¢ºã«éçŽããã¿ãŒã²ãããæ£ç¢ºã«è¿ããŸãã
createMapperã¡ãœããã¯ãJW.ArrayãšJW.ObservableArrayã®äž¡æ¹ã§æ©èœããŸãã æåã®å Žåã®ã¿ãJW.Arrayã¯ã€ãã³ããã¹ããŒããªããããå®æ°ã®ããŒã¿ãã€ã³ãã£ã³ã°ãå®è£
ã§ããŸããã ãã ããå¿
èŠã«å¿ããŠããã€ã§ãJW.ArrayãJW.ObservableArrayã«çœ®ãæããããšãã§ããå®å
šã«å€åœ¢çãªãœãªã¥ãŒã·ã§ã³ãéçºã§ããŸãã
jWidgetã¯ãåºç¯ãªã·ã³ã¯ããã€ã¶ãŒãæäŸããŸãã å®å
šãªãªã¹ãã«ã€ããŠã¯ã
ããã¥ã¡ã³ããåç
§ããŠãã ããã
ã³ã¬ã¯ã·ã§ã³ã®èŠçŽ ã¯ã
ownItemsã¡ãœããã䜿çšããŠéçŽã§ããŸãã
5.ã³ã³ããŒãã³ã
æåŸã«ããã¬ãŒã³ããŒã·ã§ã³ã«è¡ããŸããã jWidgetã¯ããã¹ãŠã®ãã¬ãŒã³ããŒã·ã§ã³ã³ã³ããŒãã³ãã®åºæ¬ã¯ã©ã¹ãšããŠ
JW.UI.Componentã¯ã©ã¹ãæäŸããŸãã åã³ã³ããŒãã³ãã¯ã©ã¹ã«ã¯ç¬èªã®ãã³ãã¬ãŒããããããã®ã¯ã©ã¹ã§ç¶æ¿ãããŸãã ãã³ãã¬ãŒãã¯ãã¬ãŒã³HTMLã§ã2ã€ã®æ°ããå±æ§
jwclassãš
jwidã
è¿œå ãããŸãã ãã³ãã¬ãŒãã¯ã
JW.UI.templateã¡ãœããã䜿çšããŠã³ã³ããŒãã³ãã¯ã©ã¹ã«ãã€ã³ããããŸãã
var MyComponent = function(message, link) { MyComponent._super.call(this); this.message = message; this.link = link; }; JW.extend(MyComponent, JW.UI.Component, {
jwclasså±æ§ã¯ã³ã³ããŒãã³ãã®ã«ãŒãèŠçŽ ã«å¯ŸããŠã®ã¿èšå®ãããCSSèŠçŽ ã¯ã©ã¹ã®ãã¬ãã£ãã¯ã¹ã§ãã jwidå±æ§ã¯ããã®èŠçŽ ã®CSSã¯ã©ã¹ã®æ¥å°ŸèŸã§ãã ããšãã°ãäžèšã®ãã³ãã¬ãŒãã¯æ¬¡ã®HTMLã«å±éãããŸãã
<div class="my-component"> <div class="my-component-hello-message" /> <a href="#" class="my-component-link">Click me!</a> </div>
DOMã§ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããã«ã¯ã次ã®æ瀺ã䜿çšã§ããŸãã
var component = new MyComponent("Hello, Wanderer!", "http://google.com"); component.renderTo("body");
ã³ã³ããŒãã³ãã³ãŒãã¯ã
getElementã¡ãœããã䜿çšãããšãjwidã«ãã£ãŠèŠçŽ ã®jQueryã©ãããŒãååŸã§ããããšã瀺ããŠããŸãã
renderComponentã¡ãœããã¯ãã³ã³ããŒãã³ãã®ã©ã€ããµã€ã¯ã«ã¡ãœããã§ãã ãªãŒããŒããŒãããããšã«ãããã³ã³ããŒãã³ãã®ã³ã³ããŒãã³ããæäœããåã³ã³ããŒãã³ããäœæã§ããŸãã
åã³ã³ããŒãã³ãã«ã¯3ã€ã®ã¿ã€ãããããŸãã
- ååä»ãåã³ã³ããŒãã³ã
- ç°¡åã«äº€æå¯èœãªåã³ã³ããŒãã³ã
- åã³ã³ããŒãã³ãã®é
å
ååä»ãåã³ã³ããŒãã³ãã¯ãæå®ããããã³ãã¬ãŒãèŠçŽ ãå®å
šã«çœ®ãæããŸãã ããšãã°ãã¢ããªã±ãŒã·ã§ã³ãã¿ã€ãã«ãšã³ã³ãã³ãã§æ§æãããŠãããšããŸãã ããããååä»ãåã³ã³ããŒãã³ãã«ããŸãããã ããã¯ããããã
åèŸæžã«è¿œå ããããšã«ããè¡ãããŸãã
var Application = function() { Application._super.call(this); }; JW.extend(Application, JW.UI.Component, { renderComponent: function() { this._super(); this.children.set(this.own(new Header()), "header"); this.children.set(this.own(new Content()), "content"); } }); JW.UI.template(Application, { main: '<div jwclass="application">' + '<div jwid="header" />' + '<div jwid="content" />' + '</div>' });
ããããŒãšã³ã³ãã³ããã¬ã³ããªã³ã°ããããheaderãèŠçŽ ãšãcontentãèŠçŽ ã眮ãæããããŸãã èŸæžã®ã³ã³ããŒãã³ãããã®å Žã§è¿œå ããã³åé€ããŠãã³ã³ããŒãã³ãã®ã³ã³ãã³ããæäœã§ããŸãã
ç°¡åã«äº€æå¯èœãªåã³ã³ããŒãã³ãã¯ååä»ã
ã³ã³ããŒãã³ãã«äŒŒãŠããŸãããJW.Propertyã«åºã¥ããŠæ©èœããŸãã ãããã¯
addReplaceableã¡ãœããã«ãã£ãŠè¿œå ãããŸãã ãã®ãããªã³ã³ããŒãã³ãã¯
JW.Mapperã䜿çšããŠäŸ¿å©ã«ã¬ã³ããªã³ã°ãããŸãïŒ
var Application = function(selectedDocument) { Application._super.call(this); this.selectedDocument = selectedDocument; }; JW.extend(Application, JW.UI.Component, {
ãããã£ãŠãselectedDocumentããããã£ã«ããŒã¿ãã€ã³ãã£ã³ã°ãå®è£
ããŸããã ãã®ããããã£ã®å€ãå€æŽãããšãå€ãããã¥ã¡ã³ãã®è¡šçŸãèªåçã«ç Žæ£ãããæ°ããããã¥ã¡ã³ãã®è¡šçŸãäœæãããå€ãããã¥ã¡ã³ãã®ä»£ããã«ãªããŸãã
åã³ã³ããŒãã³ãã®é
å㯠ãJW.AbstractArrayã«åºã¥ããŠããŸãã ãããã¯
addArrayã¡ãœããã«ãã£ãŠè¿œå ãããŸãã é
åãJW.ObservableArrayã®å Žåãã¡ãœããã¯ãã¥ãŒãšãã®é
åã®ç¶ç¶çãªåæãæäŸããŸãã åã³ã³ããŒãã³ãã®é
åã¯ãcreateMapperã¡ãœããã䜿çšããŠäŸ¿å©ã«ã¬ã³ããªã³ã°ãããŸãã
var Application = function(documents) { Application._super.call(this); this.documents = documents; }; JW.extend(Application, JW.UI.Component, {
ååä»ãã®ç°¡åã«äº€æå¯èœãªåã³ã³ããŒãã³ããšã¯ç°ãªããé
åã¯æå®ãããèŠçŽ ã眮ãæããŸãããããã®èŠçŽ å
ã«åã³ã³ããŒãã³ããè¿œå ããŸãã ãããã£ãŠãaddArrayã¡ãœããã®2çªç®ã®åŒæ°ãã¹ãããããããšã«ãããã³ã³ããŒãã³ãã®ã«ãŒãèŠçŽ ã«çŽæ¥ãåã³ã³ããŒãã³ãã®é
åãè¿œå ã§ããŸãã
䟿å®äžãjWidgetã§ã¯renderChildIdã¡ãœãããå®çŸ©ã§ããŸããChildIdã¯èŠçŽ ã®jwidã§ãCamelCaseã§å€§æåã«ãªã£ãŠããŸãã ãã®ã¡ãœããã¯ãå
¥åãšããŠãã³ãã¬ãŒãèŠçŽ ãåãå
¥ããŸãã 以äžã¯ããã®ã¡ãœããã®ããŸããŸãªæ©èœã§ãã
var Application = function(title, documents, selectedDocument) { Application._super.call(this); this.title = title; this.documents = documents; this.selectedDocument = selectedDocument; }; JW.extend(Application, JW.UI.Component, {
ã³ã³ããŒãã³ãã®HTMLãã³ãã¬ãŒãã¯ã
jWidget SDKã䜿çšããŠå¥ã®HTMLãã¡ã€ã«ã«ç§»åã§ã
ãŸã ã 詳现ã«ã€ããŠã¯ãã¬ã€ãã®
ãããžã§ã¯ãã€ã³ãã©ã¹ãã©ã¯ãã£ã»ã¯ã·ã§ã³ãã芧ãã ããã ãã¬ãŒã ã¯ãŒã¯ãæåããå ŽåãjWidget SDKã眮ãæããGruntJSã®ãã©ã°ã€ã³ãäœæããäºå®ã§ãã å
ã»ã©jWidget SDKã«ã€ããŠ
æžããŸããããããŸããµããŒããããŠããŸããã ãããŠä»ãåçã®ãããžã§ã¯ãGruntJSãç»å Žããããã«å·šå€§ãªãµããŒããèŠã€ããŠã³ãã¥ããã£ã圢æããŸããã ãã®ãããjWidget SDKã®éçºãæå°éã«æããŠããŸãã
ãã®èšäºãã圹ã«ç«ãŠã°å¹žãã§ãã JavaScriptããã°ã©ããŒã®äžã«ã¯ãç§ã®ããã«ãå®éã®ãªããžã§ã¯ãæåããã°ã©ãã³ã°ã®ãã¡ã³ã§ãããã³ãŒãå®è¡ã®é«éæ§ãé«ãè©äŸ¡ããŠãã人ããããšç¢ºä¿¡ããŠããŸãã ãããããªããªããä»äºã§jWidgetãè©ŠããŠãã ããããã£ããããããšã¯ãããŸããã èšå€§ãªéã®MV *ãã¬ãŒã ã¯ãŒã¯ããã£ããšããŠããjWidgetã奜ã¿ãŸãã ç§ã¯ããã¥ã¡ã³ãã®ç¶æãåå¿è
åãã®ãã¥ãŒããªã¢ã«ãããã³åäœãã¹ãã®ç¶¿å¯ãªã«ããŒã«å€å€§ãªåŽåãè²»ãããŠããŸãã ãããžã§ã¯ããããã«çºå±ãããæé·ããããå Žåã¯ã
GitHubã«ã¢ã¹ã¿ãªã¹ã¯ãä»ã
㊠Twitter
@jwidgetprojectã§ãã©ããŒããŠãã ããã ãŸãã建èšçãªæ¹å€ãšè¯ãææ¡ã«æè¬ããŸãã ããããšã