TodoMVC Webãµã€ãã«ãããã¹ãŠã®ãœãªã¥ãŒã·ã§ã³ããã°ãã調ã¹ããšãããjWidgetã«äŒŒããã¬ãŒã ã¯ãŒã¯ã¯1ã€ãèŠã€ãããŸããã§ããã å®éãJavaScriptã«å ããŠãJavaãCïŒãªã©ã®ãªããžã§ã¯ãæåããã°ã©ãã³ã°èšèªã§ããã°ã©ãã³ã°ãè¡ã£ãŠããŸãããŸããéå»ã«ã¯C ++ã§ããã°ã©ãã³ã°ãè¡ã£ãŠããŸãã ãããã£ãŠãç§ã¯ãªããžã§ã¯ãæåããã°ã©ãã³ã°ã åºãåå ã ãªããžã§ã¯ãæåèšèšã®ãã¿ãŒã³ã®å€§ãã¡ã³ã§ãã æšæºã®ãªããžã§ã¯ãæåãœãªã¥ãŒã·ã§ã³ã䜿çšããå¯èœæ§ãå¶éãããã¬ãŒã ã¯ãŒã¯ã¯å¿ èŠãããŸããã æ¢åã®TodoMVCãœãªã¥ãŒã·ã§ã³ã§ç§ãèŠããã®ã¯ããã®ç¹ã§èªä¿¡ãåŒã³èµ·ãããã®ã§ã¯ãããŸããã ååãšããŠããããã¯ããã€ãã®å®£èšæ§æãšåŒ·åãªãã³ãã¬ãŒããšã³ãžã³ãæäŸããŸãããããããã¹ãŠã®ãªããžã§ã¯ãæåã®åºç€ã¯ãããšãååšããŠããç§ãã¡ã®ç®ã«ã¯èŠããŸããã
è±èªã®ããã¥ã¡ã³ãïŒ http : //enepomnyaschih.github.io/jwidget/index.html#! / guide / home
ãã·ã¢èªã®ããã¥ã¡ã³ãïŒ http : //enepomnyaschih.github.io/jwidget/index.html#! / guide / ruhome
GitHubãããžã§ã¯ãïŒ https : //github.com/enepomnyaschih/jwidget
TwitterïŒ @jwidgetproject
jWidgetã§ã®TodoMVCå®è£ ïŒ http ://enepomnyaschih.github.io/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ã¯ã©ã¹ã®å®£èšã®äŸã§ãã ã¯ã©ã¹ã¯ãå°éã®æ§æç³ã§åžéããããããã¿ã€ããä»ããæšæºç¶æ¿ã«ãã£ãŠäœæãããŸãã
// . var Hand = function(side) { // . Hand._super.call(this); // . this.side = side; // , . // , . this.grabbedObject = null; }; // Hand JW.Class. JW.extend(Hand, JW.Class, { // , . // String side; // Grabbable grabbedObject; // . grab: function(obj) { this.grabbedObject = obj; }, // . destroy: function() { console.log("Destroying " + this.side + " hand"); // _super. this._super(); } });
JW.Classã®äž»èŠãªæ©èœã®1ã€ã¯ãå¥ã®ãªããžã§ã¯ãã®å¶åŸ¡äžã«ãããªããžã§ã¯ããç Žæ£ãããªããžã§ã¯ãéçŽã¡ã«ããºã ã§ãã ãã®ã¢ã€ãã¢ã¯ã ããªããžã§ã¯ãæåèšèšã®ããªãã¯ããšããæ¬ã®çŽ¹ä»ããåŸããã®ã§ãã ã®ã£ã³ã°ãªããã©ãŒã®ãã¶ã€ã³ãã¿ãŒã³ ã ãªããžã§ã¯ããžã®ãã¹ãŠã®ãã€ã³ã¿ãŒã¯ãéçŽãšèªèã®2ã€ã®ã¿ã€ãã«åããããããšãããããŸãã èªèãšã¯ããã€ã³ã¿ãŒãææãããªããžã§ã¯ããããã®ãã€ã³ã¿ãŒãåç §ãããªããžã§ã¯ãã«å¯ŸããŠäžåã®è²¬ä»»ãè² ããªãããšãæå³ããŸãã 圌ã¯åã«èªåã®ãããªãã¯ãã£ãŒã«ããšã¡ãœããã«ã¢ã¯ã»ã¹ã§ããŸããããã®ãªããžã§ã¯ãã®æå¹æéã¯åœŒã®å¶åŸ¡äžã«ã¯ãããŸããã ãã ããéçŽãšã¯ããªã³ã¯ãææãããªããžã§ã¯ããããã®ãªã³ã¯ãåç §ãããªããžã§ã¯ããç Žæ£ãã責任ãããããšãæå³ããŸãã ååãšããŠãããè€éãªã±ãŒã¹ããããŸãããéçŽãªããžã§ã¯ãã¯ææè ãªããžã§ã¯ããçããŠããéãåç¶ããŸãã
jWidgetã§ã¯ãéçŽã¯JW.Classã¯ã©ã¹ã®ç¬èªã®ã¡ãœãããä»ããŠå®è£ ãããŸãã ãªããžã§ã¯ãBããªããžã§ã¯ãAã®ç¬èªã®ã¡ãœããã«æž¡ãããšã«ããããªããžã§ã¯ãAããªããžã§ã¯ãBã®ææè ã«ããŸããããªããžã§ã¯ãAãç Žæ£ãããšããªããžã§ã¯ãBã¯èªåçã«ç Žæ£ãããŸãã 䟿å®äžãç¬èªã®ã¡ãœããã¯ãªããžã§ã¯ãBãè¿ããŸãã以äžã¯ããã®æ©èœã䜿çšããã³ãŒãã®äŸã§ãã
var Soldier = function() { Soldier._super.call(this); // . - , // . this.leftHand = this.own(new Hand("left")); this.rightHand = this.own(new Hand("right")); }; JW.extend(Soldier, JW.Class, { // Hand leftHand; // Hand rightHand; destroy: function() { console.log("Destroying soldier"); this._super(); } });
ããã§ã 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; // . this.titleChangeEvent = this.own(new JW.Event()); }; JW.extend(Document, JW.Class, { // String title; // JW.Event titleChangeEvent; setTitle: function(title) { if (this.title === title) { return; } this.title = title; // . this.titleChangeEvent.trigger(new JW.ValueEventParams(this, title)); } }); var Client = function(document) { Client._super.call(this); this.document = document; // . , // . this.own(document.titleChangeEvent.bind(this._onTitleChange, this)); }; JW.extend(Client, JW.Class, { // Document document; _onTitleChange: function(params) { console.log("Changed title to " + params.value); } }); // . var doc = new Document("apple"); var client = new Client(doc); doc.setTitle("banana"); // : Changed title to banana doc.setTitle("cherry"); // : Changed title to cherry // , . client.destroy(); doc.destroy();
ã€ãã³ãã¯JW.Eventã¯ã©ã¹ã«ãã£ãŠè¡šãããŸãã ã€ãã³ããµãã¹ã¯ãªãã·ã§ã³ã¯ã JW.EventAttachmentã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãšããŠbindã¡ãœããã«ãã£ãŠè¿ãããŸãã ãµãã¹ã¯ãªãã·ã§ã³ãç Žæ£ããããšã¯ãã€ãã³ããããµãã¹ã¯ãªãã·ã§ã³ã解é€ããããšãšåãã§ãã ããªã¬ãŒã¡ãœããã䜿çšããŠã€ãã³ããã¹ããŒããå Žåã JW.EventParamsã®ã€ã³ã¹ã¿ã³ã¹ãããã«æž¡ããŠãã€ãã³ããã³ãã©ãŒã«åŒæ°ãšããŠæž¡ããŸãã
3.ããããã£ãšãã®ãã«ããŒ
ãã¬ãŒã ã¯ãŒã¯ã¯ãããŒã¿ãã€ã³ãã£ã³ã°ã®å¯èœæ§ãæäŸããªãå Žåãæ¬æ ŒçãªMV *ãã¬ãŒã ã¯ãŒã¯ãšåŒã¶ããšã¯ã§ããŸããã jWidgetã¯ãã®æ©èœãæäŸããŸãã 次ã®ã¯ã©ã¹ã®ãªããžã§ã¯ãã¯ãå€æŽã«é¢ããã€ãã³ããèªåçã«ã¹ããŒãããããããŒã¿ãã€ã³ãã£ã³ã°ã«äœ¿çšã§ããŸãã
次ã®æ®µèœã§ã³ã¬ã¯ã·ã§ã³ïŒé åãããããã»ããïŒã«ã€ããŠèª¬æããŸãã 次㫠ãããããã£ïŒ JW.Property ïŒã«ã€ããŠèª¬æããŸãã ããããã£ã¯ãå€ã®å€æŽã«é¢ããã€ãã³ããã¹ããŒãããå€æ°ãã§ãã ãããã£ãŠããã®ã¯ã©ã¹ã®æãåçŽãªã€ã³ã¿ãŒãã§ãŒã¹ïŒ
- Getã¡ãœãã
- èšå®æ¹æ³
- ChangeEventã€ãã³ã
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(""); // assertEqual("1500 ", target.get());
æåŸã«ãäœããã®è¡šçŸèŠçŽ å ã®ããã¹ããæ§ç¯ãããããããã£ã«ãã€ã³ãããŸãã
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ã§åãæäœãå®è¡ããããã«èšèšãããåäžã®éçã¡ãœããã®ã»ããããããŸãã äŸãšããŠãã¢ãã«ãªããžã§ã¯ãã®é åã䜿çšããŠãã¥ãŒãªããžã§ã¯ãã®é åãäœæããæäœãåŒçšããŸãã
// @param {JW.AbstractArray} documents function createDocumentViews(documents) { return documents.$map(function(document) { return new DocumentView(document); }, this); }
ãã®éãåã«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, { // String message; // String link; renderComponent: function() { this._super(); this.getElement("hello-message").text(this.message); this.getElement("link").attr("href", this.link); } }); JW.UI.template(MyComponent, { main: '<div jwclass="my-component">' + '<div jwid="hello-message" />' + '<a href="#" jwid="link">Click me!</a>' + '</div>' });
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, { // JW.Property selectedDocument; renderComponent: function() { this._super(); var documentView = this.own(new JW.Mapper([ this.selectedDocument ], { createValue: function(document) { return new DocumentView(document); }, destroyValue: function(documentView) { documentView.destroy(); }, scope: this })).target; this.addReplaceable(documentView, "document"); } }); JW.UI.template(Application, { main: '<div jwclass="application">' + '<div jwid="document" />' + '</div>' });
ãããã£ãŠãselectedDocumentããããã£ã«ããŒã¿ãã€ã³ãã£ã³ã°ãå®è£ ããŸããã ãã®ããããã£ã®å€ãå€æŽãããšãå€ãããã¥ã¡ã³ãã®è¡šçŸãèªåçã«ç Žæ£ãããæ°ããããã¥ã¡ã³ãã®è¡šçŸãäœæãããå€ãããã¥ã¡ã³ãã®ä»£ããã«ãªããŸãã
åã³ã³ããŒãã³ãã®é å㯠ãJW.AbstractArrayã«åºã¥ããŠããŸãã ãããã¯addArrayã¡ãœããã«ãã£ãŠè¿œå ãããŸãã é åãJW.ObservableArrayã®å Žåãã¡ãœããã¯ãã¥ãŒãšãã®é åã®ç¶ç¶çãªåæãæäŸããŸãã åã³ã³ããŒãã³ãã®é åã¯ãcreateMapperã¡ãœããã䜿çšããŠäŸ¿å©ã«ã¬ã³ããªã³ã°ãããŸãã
var Application = function(documents) { Application._super.call(this); this.documents = documents; }; JW.extend(Application, JW.UI.Component, { // JW.AbstractArray documents; renderComponent: function() { this._super(); var documentViews = this.own(this.documents.createMapper({ createItem: function(document) { return new DocumentView(document); }, destroyItem: function(documentView) { documentView.destroy(); }, scope: this })).target; this.addArray(documentViews, "documents"); } }); JW.UI.template(Application, { main: '<div jwclass="application">' + '<div jwid="documents" />' + '</div>' });
ååä»ãã®ç°¡åã«äº€æå¯èœãªåã³ã³ããŒãã³ããšã¯ç°ãªããé åã¯æå®ãããèŠçŽ ã眮ãæããŸãããããã®èŠçŽ å ã«åã³ã³ããŒãã³ããè¿œå ããŸãã ãããã£ãŠã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, { // JW.Property<String> title; // JW.AbstractArray<Document> documents; // JW.Property<Document> selectedDocument; // , . renderTitle: function(el) { this.own(new JW.UI.TextUpdater(el, this.title)); }, // JW.UI.Component, . renderHeader: function() { return this.own(new Header()); }, // JW.AbstractArray, . renderDocumentList: function() { return this.own(this.documents.createMapper({ createItem: function(document) { return new DocumentListItem(document); }, destroyItem: JW.destroy, // scope: this })).target; }, // JW.Property, . renderSelectedDocument: function() { return this.own(new JW.Mapper([ this.selectedDocument ], { createValue: function(document) { return new DocumentPanel(document); }, destroyValue: JW.destroy, // scope: this })).target; }, // false, DOM renderHappyNewYear: function() { return new Date().getMonth() === 0; } }); JW.UI.template(Application, { main: '<div jwclass="application">' + '<div jwid="title" />' + '<div jwid="header" />' + '<div jwid="document-list" />' + '<div jwid="selected-document" />' + '<div jwid="happy-new-year">Happy new year!</div>' + '</div>' });
ã³ã³ããŒãã³ãã®HTMLãã³ãã¬ãŒãã¯ã jWidget SDKã䜿çšããŠå¥ã®HTMLãã¡ã€ã«ã«ç§»åã§ããŸã ã 詳现ã«ã€ããŠã¯ãã¬ã€ãã®ãããžã§ã¯ãã€ã³ãã©ã¹ãã©ã¯ãã£ã»ã¯ã·ã§ã³ãã芧ãã ããã ãã¬ãŒã ã¯ãŒã¯ãæåããå ŽåãjWidget SDKã眮ãæããGruntJSã®ãã©ã°ã€ã³ãäœæããäºå®ã§ãã å ã»ã©jWidget SDKã«ã€ããŠæžããŸããããããŸããµããŒããããŠããŸããã ãããŠä»ãåçã®ãããžã§ã¯ãGruntJSãç»å Žããããã«å·šå€§ãªãµããŒããèŠã€ããŠã³ãã¥ããã£ã圢æããŸããã ãã®ãããjWidget SDKã®éçºãæå°éã«æããŠããŸãã
ãã®èšäºãã圹ã«ç«ãŠã°å¹žãã§ãã JavaScriptããã°ã©ããŒã®äžã«ã¯ãç§ã®ããã«ãå®éã®ãªããžã§ã¯ãæåããã°ã©ãã³ã°ã®ãã¡ã³ã§ãããã³ãŒãå®è¡ã®é«éæ§ãé«ãè©äŸ¡ããŠãã人ããããšç¢ºä¿¡ããŠããŸãã ãããããªããªããä»äºã§jWidgetãè©ŠããŠãã ããããã£ããããããšã¯ãããŸããã èšå€§ãªéã®MV *ãã¬ãŒã ã¯ãŒã¯ããã£ããšããŠããjWidgetã奜ã¿ãŸãã ç§ã¯ããã¥ã¡ã³ãã®ç¶æãåå¿è åãã®ãã¥ãŒããªã¢ã«ãããã³åäœãã¹ãã®ç¶¿å¯ãªã«ããŒã«å€å€§ãªåŽåãè²»ãããŠããŸãã ãããžã§ã¯ããããã«çºå±ãããæé·ããããå Žåã¯ã GitHubã«ã¢ã¹ã¿ãªã¹ã¯ãä»ã㊠Twitter @jwidgetprojectã§ãã©ããŒããŠãã ããã ãŸãã建èšçãªæ¹å€ãšè¯ãææ¡ã«æè¬ããŸãã ããããšã