Angular.jsã¨Backbone.jsã®DOMä¾åãå³è§£ãã
ææ¢ã«ãMVCãã¬ã¼ã ã¯ã¼ã¯ã®å³è§£ã試ã¿ãã®ã§ãã©ããï¼
MVCã®åæ©
MVCã¨ããè¨èã初めて登場ãã¦ãã30年以ä¸ãã£ãä»ãææ©ãªãã ã£ãã®ãåãããªãã»ã©MVCã®å®ç¾©ã¯æ··è¿·ããããã¦ããããã ããã©ããMVCã§MVVMã§MVPã§ããã¨ããå®ç¾©ã«ã¤ãã¦ããããèå¯ããã®ã¯å人çã«ã¯å¥½ãã§ãªãã¦ããçµå±ä½ããããã®ããã¨ããåæ©ãã¶ãã¦ããªããã°ä½ã§ãè¯ãã¨æã£ã¦ããã
ãããããã¯ä¸ä½ä½ãªã®ãã¨ãããã¨ãèªåãªãã«èãã¦ã¿ãã¨ãããæ¬¡ã®ä¸è¨ã«è½ã¡çããã
ãModelã¯Viewã«ä¾åããããªãã
ä¸éçã«ã¯ï¼ï¼ï¼Modelã¨Viewãåã«ãåãããã¨èª¬æããããã¨ãå¤ãããç§ã¯ããã ãã§ã¯ç´å¾ãã¦ããªãã¦ãä¾åã®æ¹åãããéè¦ã ã¨æã£ã¦ããããã¨ãåããã¦ããããã«è¦ãã¦ãModelãViewãåç
§ãã¦ããããæ
å ±ã®åå¾å
ãè¡¨ç¾æ¹æ³ã¯åºå®åããã¦ãã¾ãã
Modelã¯Viewã®äºæ
ããç¬ç«ãã¦åããViewã¯Modelã®åãã«å¿ãã¦èªç±ã«è¡¨ç¾ãã¹ããããããä¸çãå®ç¾ããããã ããä¾åé¢ä¿ã¯å¸¸ã«ã
View â Model
ã¨ãªã£ã¦ããã®ãMVCçã«ã¯æ£ããã
ãã¦ãããã¾ã§Controllerãç»å ´ãã¦ããªãã®ã ããControllerã¯å®ç¾ããããã¨ã«å¯¾ããææ®µã§ãã£ã¦ãåæ©ã¨ã¯ç¡é¢ä¿ã ã
ã§ã¯ä½ããããã¨ããã¨ãModelã夿´ããããã¨ããã£ã¦Viewã«åãã¨ããåå³ãéãã ãããããç¡ãã¨ãã Modelã夿´ãããã ãã§Viewã«åæ ãããªããããã¨ããããå½ããåã®è©±ãªã®ã§ãããããããªéå±ãªä½æ¥ã¯ããã°ã©ããèªåã§æ¸ããããªããã§ããã°èªååããã¦æ¬²ãããã ããControllerã¯ãã¾ã表ã«åºã¦ãã¦æ¬²ãããªãã
ããã§ãModelã®å¤æ´ãViewã«ä¼ããããã®ææ®µã¯å¤§ã¾ãã«ï¼ã¤ã«åããããã
A: Modelã¸ã®æ´æ°ãçµãã£ãã¿ã¤ãã³ã°ã§ãControllerãViewã«æä»¤ãåºã
var model = new Model(); var view = new View(model); model.update(e); view.render();
B: ViewãModelã®å¤æ´ãåãåãããã®Observerã«ãªã
var model = new Model(); var view = new View(model);// å é¨ã§Modelã«å¯¾ãã¦ãªã¹ãã¼ã仿ãã model.update(e);
Bã®æ¹ãã¨ã¬ã¬ã³ãã ãå®è£ ãé£ããã¨æãããã
JavaScriptã§MVCãã
ãããªMVCãæè¿JavaScriptã®ä¸çã§æµè¡ã£ã¦ããã
徿¥ã®Webã¢ããªã±ã¼ã·ã§ã³ã¯ãDOM = Modelã¨ããèªèã§ãã£ã¦åé¡ãªãã£ãããã ããæè¿ã®ã¢ããªã¯ï¼ãã¼ã¸å
ã§ç¶æ
ãããããå¤ããããããããJavaScriptãªãã¸ã§ã¯ãã¨ãã¦ï¼= Modelï¼ç¬ç«ãã¦ç®¡çããããã«ãªã£ãçµæãDOM = Viewã«ãªã£ããã«ãé¢ãããã徿¥ã®ãDOMを周りからこちょこちょするやり方ãã®å¼åãå¼·ããã¦ãªããªãæãåºããªãããããã¯å¤§ä½ã®ã¢ããªãããã§æ¸ãããã«ããããå¤å¤§ãªã³ã¹ããæã£ã¦MVCããã¡ãªãããè¦ããªãã¨ããã®ãç¾ç¶ã§ããã
ä½ã¯ã¨ããããHTML5ã®ç»å ´ããã£ã¦ãã©ã¦ã¶ã§ä½ã§ãããæä»£ãæ¥ãã®ã§ãJavaScriptã§MVCãããã¦ãã¦ãæºãã¦ç½®ãã®ã¯è¯ããã¨ã ã¨æãã
åç½®ããé·ãããã®ã§å
ã«æ»ãã¨ãå¦ä½ã«ãã¦ModelãViewããç¬ç«ãã¦åããViewãããã«è¿½å¾ãããã¨ãã話ã ã£ãã
ããã§ã¯ä¸è¨ï¼ãã¿ã¼ã³ã®ãã¡ãAã®ä»£è¡¨ã¨ãã¦Angular.jsãBã®ä»£è¡¨ã¨ãã¦Backbone.jsã«ç»å ´ãã¦ããããã¨ã«ãã*1ã
以éã話ãç°¡åã«ããããã«Viewã¨ã¯å³ã¡DOMã®äºã¨ãããã¤ã¾ããã©ã®ããã«ãã¦DOMã¸ã®ä¾åãåãé¢ããã¦ãããã¨ããç¹ã«ã¤ãã¦ã®ã¿çç®ãããéã«è¨ãã¨ä»ã®é¢å¿äºï¼ä¾ãã°ããã©ã¼ãã³ã¹ï¼ã«ã¤ãã¦ã¯å ¨ã触ããªãï¼åæã«æ²¢å±±ã®ãã®ãæ¯è¼ããã¨ãããããã«ãªã£ã¦ãã¾ãããï¼ããã¬ã¼ã ã¯ã¼ã¯ãç·åçã«å¤æãããæ¹ã¯å¥ã®è¨äºãåç §ãã¦ããã ãããã
å³ã®è¦æ¹
ä¸é¨ãModelã§ä¸é¨ãViewãæ°´é¢ããä¸ã¯DOMã«ä¾åãã¦ããã
- Mï¼Model
- Uï¼æ´æ°ç¨ã¡ã½ããï¼MVCã®å®ç¾©ä¸ããã¯Modelã¨ãªã£ã¦ãããåãããããã®ããä¸å¿åãã¦ããï¼
- ç¢å°ï¼ä¾åã®æ¹åã
- å®ç·ï¼èªåã§å®è£ ããé¨åã
- ç ´ç·ï¼ãã¬ã¼ã ã¯ã¼ã¯ã«é è½ããã¦ããé¨åã
- é»ï¼å¶å¾¡ã»åç §
- éï¼inputè¦ç´ ããModelã¸ã®å¤æ
- ç·ï¼ãã®ä»ã®ã¤ãã³ã
- ç´«ï¼Model夿´ã®éç¥
- 赤ï¼DOMã¸ã®åæ
å®ç·ã®ç¢å°ã¯å¸¸ã«ä¸ï¼Viewï¼ããä¸ï¼Modelï¼ã«åãã£ã¦ä¼¸ã³ã¦ããã®ã好ã¾ããã
ç¢å°ã¯ããã¾ã§ä¾åã®æ¹åã§ããããããã¼ã¿ããã¼ã»å¶å¾¡ããã¼ã¨ã¯éã«ãªããã¨ãããã®ã§æ³¨æã
ï¼æ¸ããå¾ã§æã£ãã®ã ããå®éã«è§¦ãã¦ã¿ãªãã¨ãã®å³ãè¦ã¦ãã¾ããã³ã¨æ¥ãªãã¨æãããªãã¨ãããç³ã訳ãªããï¼
Angular.jsã®å ´å
æ°´ä¸ãAngular.jsã®Controllerãæ°´é¢ä¸ãHTMLã«ãããã
Angular.jsã¯å°ç¨ã®Modelãªãã¸ã§ã¯ããç¨æãã¦ããªãã®ã§ãå³ã®Mã¯ä½ã®å¤å²ããªãæ®éã®JavaScriptãªãã¸ã§ã¯ãã§ããã
ã¾ããinputè¦ç´ ãæ´æ°ãããã¨å³åº§ã«Modelã«å¤æãããï¼éï¼ãã¾ãã¯ã¤ãã³ãã«ãã£ã¦æ´æ°ç¨ã®ã¡ã½ãããå¼ã°ããï¼ç·ï¼ã
ãããã®æç¤ºã¯HTMLï¼æ°´é¢ä¸ï¼ã«è¨è¿°ããããããæ°´ä¸ããã»ã¬ã¯ã¿ã§ãã¼ã¿ãå¼ã£å¼µãå¿
è¦ããªããã¾ããå³ã«è¡¨ããªã大ããªç¹å¾´ã¨ãã¦ããªãã¸ã§ã¯ããã¿ã°ã«åãè¾¼ã¾ãã«ç´æ¥ã¡ã½ããã«æ¸¡ããããã¨ãæãããããããã«ãã£ã¦ããã«DOMã«ã¢ã¯ã»ã¹ããå¿
è¦æ§ãä½ããªã£ã¦ããã
ããã¦æ´æ°ãçµããã¨Viewãæ°ããModelãå ã«æ´æ°ãããï¼ç´« â 赤ï¼ã
ããã§ããã¬ã¼ã ã¯ã¼ã¯ãèªåã§è¡ãé¨åï¼ç ´ç·é¨åï¼ãå ¨ã¦åã£æãã¨ãå®éã«æ¸ãå¦ç㯠U â M ã ãã«ãªã£ã¦ããããããã¢ããªã±ã¼ã·ã§ã³ã«ã¨ã£ã¦æ¬è³ªçãªå¦çã§ããããçæ³çã¨è¨ããã
ããã¤ãã®ããªã¨ã¼ã·ã§ã³
inputè¦ç´ ã«å
¥åãããã®ãå³åº§ã«ã¡ã¤ã³ã¢ãã«ã«ãªã£ã¦æ¬²ãããªãå ´åã¯ã䏿çãªModelï¼mï¼ã宣è¨ãããã¨ãå¯è½ã ã
ã¾ããModelããã®ã¾ã¾DOMã«ããã®ã§ã¯ãªãéä¸ã«ã¯ã³ã¯ãã·ã§ã³ç½®ãããå ´åã¯ãã¯ã¨ãªç¨ã®ã¡ã½ããï¼Qï¼ãç½®ããã¨ãåºæ¥ããQã«ã¯classãæ¸ããããªããã¨ãããããã®å ´åã¯CSSãæèãããããå³ã§ã¯è¥å¹²æ°´ä½ãä¸ãã¦ããã
ãªãããããã¯ãã¬ã¼ã ã¯ã¼ã¯ã®æ©è½ã§ã¯ãªããåã«å®è£ ãã¿ã¼ã³ã§ããã
éåæã»å¤é¨ããã®ã¢ãã«æ´æ°
ä»ã®Observerãã¿ã¼ã³ã使ç¨ãããã¬ã¼ã ã¯ã¼ã¯ã¨éããModelããã¥ã¢ã§ããï¼å°ç¨ã®Modelãç¨ããªãï¼ç¹ã¯ã¡ãªããã®ã²ã¨ã¤ã§ãããã¨ã¯ç¢ºãã ããéã«Controllerã®å¤é¨ããä»»æã®ã¿ã¤ãã³ã°ã§å¤æ´ããããã¨ãæ¤ç¥ã§ããªãã¨ããå¼±ç¹ããããããã¯ä¸»ã«ãéåæå¦çã«ãã夿´ã¨ãå¤é¨ã®DOMã¤ãã³ãã«ãã夿´ã§ããã
ãã®å ´åã©ããããã¨ããã¨ã$apply()ã¨ããã¡ã½ãããå¼ã¶ãã¨ã§ãã¬ã³ããªã³ã°ãæç¤ºãããã¨ãåºæ¥ãã
ãã ãããã®ãããªæ´æ°ããããã³ã«$apply()ãæç¤ºçã«å¼ã¶ã¨ãããã¸ãã¯ãæ¬å¦çã«ç´ãè¾¼ã¾ããããªããããAngular.jsã§ã¯Controllerå
ã«é è½ãã¦æé»çã«å®è¡ããããã®ä»çµã¿ãç¨æããã¦ããã
ä¾ãã°ãéåæå¦çã®æããä¾ã§ããAjaxãè¡ãããã«ã¯ãæ¢ã«ç¨æããã¦ãã$htmlã¨ããå°ç¨ã®ãªãã¸ã§ã¯ãã使ããã¨ã§ãã¬ã¹ãã³ã¹ã«ããæ´æ°ãDOMã«åæ ããããã¨ãåºæ¥ãããã ããç¨æããã¦ããªãå ´åã¯ãã®ã³ã¼ããèªåã§æ¸ãå¿
è¦ãããããã®è¾ºãã®ããã¡ãªããå人çã«ã¯å¥½ãã§ãªãã
ã¾ã¨ã
Angular.jsã¯Modelã¨Viewã®ä¾åé¢ä¿ã¨ãã¦ã¯çæ³çãDOMã«ä¸åä¾åããªãã³ã¼ããæ¸ããã¨ãåºæ¥ãã
ãã ãControllerï¼+HTMLï¼ãè·¨ãå¦çã«é¢ãã¦ã¯ã¯ãªã¼ã³ããä¿ã¤ã®ã«å·¥å¤«ãå¿
è¦ã
Backbone.jsã®å ´å
Angular.jsãè²ã
ãä¸è©±ãã¦ãããã®ã«å¯¾ãã¦ãBackbone.jsã¯å¿
è¦æå°éã®æ©è½ããæä¾ããªãã
ãObserverãã¿ã¼ã³ã§MVCããã®ã«å¿
è¦ãã¤ä¸çªé¢åãªé¨åãå®è£
ããã¦ãããã¨ããå°è±¡ãå人çã«ã¯åããï¼ãã ãæ¬å®¶ãµã¤ãã«MVCãã¬ã¼ã ã¯ã¼ã¯ã¨ãã説æã¯ãªãï¼ã
ããªãèªç±åº¦ãé«ãã®ã§ãBackbone.jsãå°å
¥ãããã¨ã§ä½ãã諦ãããããªäºæ
ã«ã¯ã¾ããªããªãã¨æã£ã¦ããã
Mã¯Backbone.Modelã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ãããã¦ãããããä¸ã«ãããã®ã¯å ¨ã¦Backbone.Viewã®ãã£ã©ã¯ã¿ã¼ã§ããã
- Uï¼Viewãªãã¸ã§ã¯ãã«å±ãããModelæ´æ°ç¨ã®ã¡ã½ããéã
- eventsï¼jQuery#onãèªåã®ç®¡è½ããDOMã«ä¸æ¬æå®ãããããã«å¯¾ãã¦ã»ã¬ã¯ã¿ã¨å§è²å ï¼Uï¼ãè¨è¿°ããã
- renderï¼DOMã®ã¬ã³ããªã³ã°ãæ å½ãï¼ãã¬ã¼ã ã¯ã¼ã¯ã«å¼ã°ããããã§ã¯ãªãï¼
- initializeï¼Modelã«ãªã¹ãã¼ã仿ããæ´æ°ãæ¤ç¥ãããrenderãå¼ã¶ããã«è¨å®ããã
- templateï¼å¿ é ã§ã¯ãªãããè¦éãã®è¯ããã使ã人ãå¤ãã¨æãããï¼Backbone.jsãå¼·ãä¾åãã¦ããUnderscore.jsã®ãã³ãã¬ã¼ãã使ãã®ãä¸è¬çï¼ã
inputè¦ç´ ãèªåã§Modelã«ãã¤ã³ããããããªæ©è½ã¯æã£ã¦ããªããããä»ã®è¦ç´ ã¨åãããã«ã¤ãã³ããåãåãã
Viewå
ã®ã¡ã½ãããModelãæ´æ°ããã¨ããã®å¤æ´ãæ¤ç¥ããæçµçã«ã¯renderã¡ã½ããã«ãã£ã¦DOMã«åæ ãããã
ããã¤ãã®ããªã¨ã¼ã·ã§ã³
ããã¤ãâ¦ã©ããã®é¨ãã§ã¯ãªããèªç±åº¦ãé«ãã®ã§バリエーションは豊富にあるã
- ã¤ãã³ãã®æ å ±ã ãã§ã¯è¶³ããªãå ´åããããDOMï¼jQueryï¼ãåç §ããããªããã¨ãããï¼éãå®ç·ï¼
- Observerã使ããã«ãUããrenderãå¼ã¶ãã¨ãåºæ¥ãï¼ç´«ã®å®ç·ï¼
- ããããrenderãããªãã¦ãDOMãæ´æ°ã§ããï¼èµ¤ãå®ç·ï¼
ãããããå§ããã¨ãã¿ãã¿ããã¡ã«ãã¸ãã¯ãDOMã®æµ·ã«æ²ãã§ãã£ã¦ãã¾ãããããªããªãããã«ã¯ãããç¨åº¦å¼·ãæå¿ãæã£ã¦DOMãã®ä¾åãåãé¢ãå¿
è¦ãããã
ã¤ã¾ãBackbone.jsã¯ãåãã£ã¦ãã人ã§ãé¢åã§å¤±æããããé¨åã䏿ãæ
ã£ã¦ãããããåãã£ã¦ããªã人ã§ãããã«æ²¿ã£ã¦æ¸ãã°èªç¶ã¨ç¶ºéºãªã³ã¼ãã«â¦ã¨ããé¡ã®ãã®ã§ã¯ãªãã
éåæã»å¤é¨ããã®ã¢ãã«æ´æ°
ViewãModelã®Observerã«ãªããã¨ã¯å©ç¹ãå¤ãã
- ã¤ãã³ãçºçæãModelã夿´ãã以å¤ã®ãã¨ãèããªãã¦è¯ãã
- ã©ã®Modelãã©ã®Viewãæ´æ°ãããã«ã¤ãã¦ãViewã®å¤é¨ã§ææ¡ãã¦ããå¿ è¦ããªãã
- ç¹ã«éåæå¦çã«ããã¦ãViewãæ´æ°ãããã¿ã¤ãã³ã°ããViewã®å¤é¨ã§ææ¡ãã¦ããå¿ è¦ããªãã
- è¤æ°ã®Viewãã²ã¨ã¤ã®Modelãå ±æãããããããModelã®å¤æ´ãèªåèªèº«ã«åæ ãããã¨ãåºæ¥ãã
æ©ã話ãModelã®å¤æ´ãåãåãã¾ããã¨ããã ããªã®ã ãã
å³ã®ããã«å¤é¨ããã®å¤æ´ããã£ãå ´åã§ãé£ãªãèªåèªèº«ã«åæ ãããã¨ãåºæ¥ãï¼ç´«ã®ç ´ç·ãObserver â renderãã®å§è²ã示ãã¦ããï¼ã
ã¾ã¨ã
Backbone.jsã¯èªç±åº¦ãé«ããViewå
ã«ããã¦DOMä¾åãé¿ããããã®å¼·å¶åãæã£ã¦ããªãã
ViewãModelã®Observerã§ãããã¨ã®å©ç¹ãæå¤§éçºæ®ã§ããã
çµè«
DOMã¨ãã以å¤ã®ä¾åé¢ä¿ã¨ãã観ç¹ã§è¦ãã¨ãAngular.jsãåªãã¦ãããå人çã«ã¯ã»ã¬ã¯ã¿ã®è¨è¿°ããè§£æ¾ããããã¨ã¨ããªãã¸ã§ã¯ããã¡ã½ããã«ç´æ¥æ¸¡ããï¼ï¼å±æ§ã®åãè¾¼ã¿ä¸è¦ï¼ãã¨ã®åã³ã大ããã
ãã ãï¼ãã®è¨äºã®ã¡ã¤ã³ã®è¶£æ¨ã§ã¯ãªããï¼Modelã®å¤æ´ãViewã«åæ ããä»çµã¿ã¨ãã¦ã¯ãã¯ãObserverãå¼·ããBackbone.jsãæ¡ç¨ããå¼·ãåæ©ã«ãªã£ã¦ããã
ã¾ããä»ååãä¸ãããã£ããç¥èä¸è¶³ã§æå¿µãããã®ã¨ãã¦ãExt.jsãBacon.jsãPolymer.js(Web Components)ãããããã®ãã¡ãã¡ããåæãã¦ã¿ããã
ã¨ããããã§ãä»åã¯ããã«ã¦ï¼
*1: http://caliper.io/blog/2013/Javascript-Framework-Popularity/ ãã¡ãã®äººæ°åº¦èª¿æ»ã«ããã¨ãå¤ãããå®å®ãã¦äººæ°ã®Backbone.jsã«Angular.jsãç追ãã¦ããçã£æä¸ã¨ããã¨ããï¼2013/06æç¹ï¼ é æåãAã¨Bã§ãã¤ã¡ã¼ã¸ã«ã©ã¼ã赤ã¨éãã¢ã¼ããã¯ãã£ã両極端ã¨ãªãã¨ã鿬¡é¦¬ã¨ãã¦ã¯ã¨ã¦ãé¢ç½ãï¼ã©ãã§ãããï¼ã