ã€ããªãã®ãŒã®ä»çµã¿ãå®èšŒããããã«ãJiantã¯ãããŸããŸãªMVCãã¬ãŒã ã¯ãŒã¯ãè©äŸ¡ããããã«äœæããããããžã§ã¯ãã§ããToDoMVCãå®è£ ããŸããã Jiantã¯MVCãã¬ãŒã ã¯ãŒã¯ã§ã¯ãªããäžé£ã®ãµããŒãããŒã«ã䜿çšããéçºãžã®ã¢ãããŒãã§ãã éçºã«çŽ8æéããããŸããã仿§ãèªãã§çè§£ããããžãã¹ã®ãªããªãã¡ã¬ã³ã¹å®è£ ïŒlocalStorageïŒïŒéåžžã«åçŽãªãã®ïŒãªã©ãæ€èšããŸããã ãããããå°ããã¯ããããŸãããããããããããŸãã çµæã¯github.com/vecnas/todomvc-jiantã«ãããŸãã Chromeããã³Firefoxã§ã¯ããã¡ã€ã«ã·ã¹ãã ãIEã§ã¯ãµãŒããŒããçŽæ¥åäœããŸãã
仿§æž
github.com/addyosmani/todomvc/wiki/App-Specification-è±èªã®ä»æ§ã ããã§ããŒãã€ã³ããèŠçŽããŸãã
ã¿ã¹ã¯ç®¡çïŒToDoïŒçšã®ããŒã«ãéçºããå¿ èŠããããŸããæ¬¡ã®ç¹ãå®è£ ããå¿ èŠããããŸãã
- ã¹ãã¬ãŒãžã ãã¹ãŠã®ã¿ã¹ã¯ãšãã®ã¹ããŒã¿ã¹ã¯ãããŒã«ã«ã¹ãã¬ãŒãžïŒHTML5 localStorageïŒã«ä¿åãããããšãã°ãã©ãŠã¶ãŒã®åèµ·åæã«åŸ©å ãããå¿ èŠããããŸãã
- ããã²ãŒã·ã§ã³ ã¢ããªã±ãŒã·ã§ã³ã¯ããã©ãŠã¶ã§ããã·ã¥ããã²ãŒã·ã§ã³ããµããŒãããå¿ èŠããããŸãã詳现ã«ã€ããŠã¯ããªãªãžãã«ãåç §ããŠãã ããã ããã§ããã²ãŒã·ã§ã³åœ¢åŒãæå®ãããŠããŸãããJiantã®åœ¢åŒã¯ãããšã¯å°ãç°ãªããŸããããã¯ãããã²ãŒã·ã§ã³ããŒããæå®ããŠãããããã«æ»ãããšãã§ããããã§ãã ããã²ãŒã·ã§ã³ããŒã®ãã¿ã³ã§å¶åŸ¡ãããŸãã 3ã€ã®ç¶æ ããããŸãïŒãã¹ãŠè¡šç€ºãã¢ã¯ãã£ã衚瀺ãå®äºå®äº
- æ°ããææŠã ããŒãžäžéšã®å ¥åãã£ãŒã«ãã«å ¥åããŠEnterããŒãæŒããšãå ¥åãããŸãã
- 倧éæäœã ç¹å¥ãªãã¿ã³ã¯ããã¹ãŠã®ã¿ã¹ã¯ãå®äºãŸãã¯æªå®äºãšããŠããŒã¯ããŸãã ãã¿ã³ã®ç¶æ ã¯ããã¹ãŠã®ã¿ã¹ã¯ã®çŸåšã®ç¶æ ãšãåæãããŸãã ã€ãŸãããã¹ãŠãæ¢ã«å®äºããŠãããšãã«æ°ãããã®ã远å ãããšãã€ã³ãžã±ãŒã¿ãŒã¯ãã¹ãŠãå®äºããããšã瀺ãã®ã忢ããŸã
- ãã£ã¬ã³ãžã 3ã€ã®ã€ã³ã¿ã©ã¯ãã£ããªèŠçŽ ã衚ããŸã-å®äºããªãã¹ã€ããã¯ãã¯ãªãã¯ãã¿ã¹ã¯ã®åé€ãã¿ã³ãããã³ååã®ããã«ã¯ãªãã¯ã«ãã£ãŠæ©èœããŸã-ã¿ã¹ã¯ãç·šéã§ããŸã
- ç·šéäž å ¥åãã£ãŒã«ããéããEnterããŒãæŒãããã©ãŒã«ã¹ã倱ãããšã§æ®ãã®èŠçŽ ãé衚瀺ã«ãªããŸã-ããã¹ããä¿åããEscããŒãæŒããŸã-ä¿åæã«ããã¹ãã空ã®å Žåããã¹ãŠã®å€æŽããã£ã³ã»ã«ããŸã-ã¿ã¹ã¯ãåé€ããŸã
- ã¢ã¯ãã£ããªã¿ã¹ã¯ã®ã«ãŠã³ã¿ãŒã çŸåšã®ã¢ã¯ãã£ããªã¿ã¹ã¯ã®æ°ã衚瀺ããŸãã倿Žãããã°åæãããŸããããã¹ãã¯èªã¿æžãå¯èœã§ããå¿ èŠããããŸãïŒã1ã¿ã¹ã¯ããã2ã¿ã¹ã¯ãïŒ
- ã¯ãªã¢ãå®äºããŸããã å®äºããã¿ã¹ã¯ã®æ°ã衚瀺ããã¯ãªãã¯ããŠåé€ããŸããå®äºããã¿ã¹ã¯ãå°ãªããšã1ã€ããå Žåã«ã®ã¿è¡šç€ºãããŸã
- ã«ãŠã³ã¿ãŒãšããã²ãŒã·ã§ã³ãã¿ã³ã®ããããã«ã¯ãå°ãªããšã1ã€ã®ã¿ã¹ã¯ãããå Žåã«ã®ã¿è¡šç€ºãããŸã
å ¥åæã«ãhtmlã³ãŒããšããã€ãã®ã€ã³ã¿ã©ã¯ãã£ãã¹ã¯ãªãããããã³ãã¹ãŠã®ã¹ã¿ã€ã«ãå«ããããžã§ã¯ããã³ãã¬ãŒããçºè¡ãããŸããã
Jiantãããžã§ã¯ãã®æ§é
çŸæç¹ã§ã¯ãçæ³çãªæ§é ã¯æ¬¡ã®ãšããã§ãã
- ã¢ããªã±ãŒã·ã§ã³å®çŸ©ãã¡ã€ã«-ã¢ããªã±ãŒã·ã§ã³APIãèšè¿°ããJSON倿°ã®å®£èš
- ãã€ã°ããã·ã§ã³ãã¯ããŠãŒã¶ãŒã«ãšã£ãŠäŸ¿å©ãªå Žæã§ããã°ã©ãã§ãbindUiãåŒã³åºããŸã
- ããã©ã°ã€ã³ãã®ã»ãã-ã¢ããªã±ãŒã·ã§ã³ããžãã¯ããããããç¬èªã®ãµã³ãããã¯ã¹ã«ã«ãã»ã«åãããã¢ããªã±ãŒã·ã§ã³APIãä»ããŠæ©èœããŸãã
åæèšèš
Jiantã¢ãããŒãã®æåã®æ®µéã¯ãæãæœè±¡çãªèšèšã§ãã æãéèŠã§ãããããïŒå°ãªããšãèªåã«ãšã£ãŠïŒçããããšã¯ããã¹ãŠã®å®è£ æ¹æ³ãå®å šã«ç¡èŠããããšã§ãã 顧客ã®èª¬æãèŠãŠãã¢ããªã±ãŒã·ã§ã³ã®èª¬æã®æåã®ããŒãžã§ã³ãäœæããŸãã ããã§ã¯ã仿§ãèªãã åŸã®æåã®èæ ®äºé ãè¿°ã¹ãŠããŸããããããžã§ã¯ãã®çµæã«åºã¥ããŠäœæãããçæ³çãªæšè«ã§ã¯ãããŸããã ã€ãŸãããã¹ãŠãéåžžã«éèŠã§ãã
å·
ããã·ã¥ããã²ãŒã·ã§ã³ãå¿ èŠãªå Žåãã¢ããªã±ãŒã·ã§ã³ã«ã¯ç¶æ ããããŸãã ãããããªã¹ãããŸãã仿§ããçŽæ¥ãªã¹ããååŸããŸãããèããªãã§ãã ããã
states: { "": { go: function () {}, start: function(cb) {}, end: function(cb) {} }, active: { go: function () {}, start: function(cb) {}, end: function(cb) {} }, completed: { go: function () {}, start: function(cb) {}, end: function(cb) {} } }
説æïŒåœ¢åŒã«åŸã£ãŠãã¢ããªã±ãŒã·ã§ã³èšè¿°å€æ°ã«ç¶æ ã»ã¯ã·ã§ã³ãå«ãŸããŠããå ŽåãJiantã¯ãªã¹ããããç¶æ ãããŒãããããããã«3ã€ã®ã¡ãœãããå®è£ ããŸãïŒgoãstartãendã goã¯ãç¶æ ãžã®ç§»è¡ãç¶æ ã®éå§ãŸãã¯çµäºãžã®å¿çã®éå§ãšçµäºã«äœ¿çšãããŸãã æçã®ãšã³ããªã¯æ¬¡ã®ããã«ãªããŸãã
states: { "": {}, active: {}, completed: {} }
ãã ãããã®å ŽåãIDEã«ã¯ãªãŒãã³ã³ããªãŒãããããŸããããã®ãããç§èªèº«ã®å©äŸ¿æ§ãšããè¯ãããã¥ã¡ã³ãã®ããã«ãæåã®è¡šèšã䜿çšããŸãã 空ã®ç¶æ ã¯ããäžç¢ºå®ãªãç¶æ³ã«å¯Ÿå¿ããŸããããšãã°ããã©ãŠã¶ãŠã£ã³ããŠãããã·ã¥ãªãã§åã«ããŒããããå Žåãªã©ã§ãã
ããã·ã¥ããã²ãŒã·ã§ã³ã«å¿ èŠãªã®ã¯ããã ãã§ãã ãã¹ãŠã®æ©èœã¯ãJiantã«ããã¢ããªã±ãŒã·ã§ã³ã®åæåæã«è¿œå ãããŸãã
ç¶æ èšèšã®ãããã¯ãå®å šã«éããããã«ã2ã€ã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠ1ã€ã®ç¶æ ãäœæã§ããŸããæ¬¡ã«äŸã瀺ããŸãã
states: { "": { go: function(showActive, showCompleted) {} } }
ãããŠããããæ©èœããŸãã ããããçŽç²ã«åå©äž»çŸ©çãªèæ ®äºé ããå·ã管çããŠããããã3ã€ã®å·ãäœæããæ¹ã䟿å©ãªããã§ãã ç¹°ãè¿ããŸãããããã¯æåã®çŽæçãªãœãªã¥ãŒã·ã§ã³ã§ãã ãšããã§ããããã®ç¶æ ã¯æçµããŒãžã§ã³ã®ãŸãŸã§ããã
ã€ãã³ã
次ã«ãã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®ã€ãã³ããæœè±¡çã«å®çŸ©ããŸãã çŽèгçã«ã次ã®ãªã¹ãã¯æ£ããããã§ãã
events: { todoAdded: { fire: function(todo) {}, on: function(cb) {} }, todoRemoved: { fire: function(todo) {}, on: function(cb) {} }, todoStateChanged: { fire: function(todo) {}, on: function(cb) {} } }
å¯äžã®ãªãã¬ã¯ã·ã§ã³ã«ãããtodoãå®äºãŸãã¯åã¢ã¯ãã£ãåããããã«ãæåŸã®ã€ãã³ãïŒã€ãã³ãã2ã€ã«åå²ããå¿ èŠããããã©ããïŒãçºçããŸããã ç¹°ãè¿ããŸããããã¹ãŠã®ã€ãã³ããµããŒãã³ãŒãã¯Jiantå ã§æ©èœãããŠãŒã¶ãŒã¯ã€ãã³ãã®æœè±¡çãªãªã¹ããå®çŸ©ããŠäœ¿çšããã ãã§ãã åã€ãã³ãã«ã¯2ã€ã®ã¡ãœããããããŸã-æããã§ãã cb颿°ïŒã³ãŒã«ããã¯ãonã¡ãœããã®ãã©ã¡ãŒã¿ãŒïŒã¯ãfireåŒã³åºããšãŸã£ããåãåŒæ°ãåããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹
次ã«ãã¢ããªã±ãŒã·ã§ã³ã®èŠèŠéšåãå®çŸ©ããå¿ èŠããããŸãã ãšã¬ã¡ã³ãã®ãªã¹ãã¯ãéåžžã©ããã顧客ã®èª¬æããç°¡åã«ã³ããŒãããŸãã ãã®ããã«æžããåŸïŒ
views: { main: { batchToggleStateCtl: ctl, newTodoTitleInput: input, todoList: container }, controls: { activeCountLabel: label, clearCompletedCtl: ctl, completedCountLabel: label, showAllCtl: ctl, showActiveCtl: ctl, showCompletedCtl: ctl } },
-ç§ã¯htmlã«å ¥ããèŠçŽ ã®èå¥åãæ¢ã«ç»é²ãããŠãããæ§é ãèšå®ãããŠããã®ã§ããããé©çšããæ¹ãè«ççã§ãã çµæïŒ
views: { header: { newTodoTitleInput: input }, main: { batchToggleStateCtl: ctl, todoList: container }, footer: { activeCountLabel: label, clearCompletedCtl: ctl, completedCountLabel: label, showAllCtl: ctl, showActiveCtl: ctl, showCompletedCtl: ctl } }
ãããŠãèšèšã®10åç®ã«äœæããããã®æ§é ã¯ããããžã§ã¯ãã®çµäºãŸã§å€æŽãããŸããã§ããã
ãã¿ãŒã³
仿§ã«åºã¥ããŠãéåžžã«åçãªèŠçŽ ã1ã€è¡šç€ºãããŸã-ã¿ã¹ã¯ã®èŠèŠç衚çŸã§ãã ãããã®æ°ã¯ç°ãªãã远å ããã³åé€ãããŸãããã®ãããJiantã®ã€ããªãã®ãŒã«ããã°ããã³ãã¬ãŒãã䜿çšããŠå®çŸ©ããã ãã§ãã
templates: { tmTodo: { deleteCtl: ctl, editCtl: ctl, stateMarker: label, toggleStateCtl: ctl, titleInput: input, hiddenInEditMode: collection, titleLabel: label } }
ç¹°ãè¿ããŸãããããäžåºŠé ãæ©ãŸããªãããã«ãååãšããŠãã¿ã¹ã¯ã®åé€ãã¿ã³ãdeleteCtlã«åŸã£ãŠã顧客ã®èª¬æãããã¹ãŠã転éããŸãã
ãã³ãã¬ãŒãã«ã€ããŠäœãèšããªããã°ãªããªãããšããããŸãã æåã«ããã£ãŒã«ãããã³ãã¬ãŒãã«å®çŸ©ãããŠããããšãããããŸããæåã«ãã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«æå¹æ§ããã§ãã¯ãããæ¬¡ã«ãã³ãã¬ãŒãããèŠçŽ ãäœæããåŸã«ãã£ãŒã«ããæ·»ä»ãããŸãã åãã³ãã¬ãŒãã«ã¯ãparseTemplateãparseTemplate2Textã®2ã€ã®ã¡ãœãããããã眮æçšã®ãã©ã¡ãŒã¿ãŒãåãå ¥ããŸãã ãã³ãã¬ãŒãã«ã¯ããžãã¯ã¯å«ãŸãããå€ã®çœ®æã®ã¿ãå«ãŸããŸããããã¯æå³çãªãã®ã§ãããJavaScriptã³ãŒãã®ããžãã¯ã®å Žæã§ãã ãã®åŸãå¥ã®ãã³ãã¬ãŒããã¢ããªã±ãŒã·ã§ã³ã«ç»å Žããå€ãã©ã®ããã«çœ®æããããã瀺ãããã«ããã«å°å ¥ãããŸããã
templates: { .... itemsLeft: {}, itemsLeft1: {} }
å®è£ ïŒ
<div id="itemsLeft1" style="display: none;"> <strong>!!count!!</strong> item left </div> <div id="itemsLeft" style="display: none;"> <strong>!!count!!</strong> items left </div>
ãããŠäœ¿çšïŒ
tm.parseTemplate2Text({count: count})
ãŸã ããŒã¿ã¢ãã«ãèšèšããŠããŸããã詳现ã«ã€ããŠã¯ã以äžãã芧ãã ããã ããã«å®è¡ããŠãäœãå£ããªãããšã確èªããããšæããŸããããã«ã¯ã¹ã¿ãŒã¿ãŒãå¿ èŠã§ãã
ã¹ã¿ãŒã¿ãŒ
çæ³çãªæ§é ã«åºã¥ããŠãã¢ããªã±ãŒã·ã§ã³ã®ã¹ã¿ãŒã¿ãŒãapp.jsãã¡ã€ã«ïŒã顧客ããã®ãåºæ¬ãã³ãã¬ãŒãã§äœ¿çšå¯èœïŒã«é 眮ããŸãããã®ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
jQuery(function() { jiant.bindUi("", todomvcJiant, true); });
htmlã³ãŒãã¯ãã§ã«é¡§å®¢ã«ãã£ãŠèšå®ãããŠããããïŒCSSã倿Žããªãããã«å€æŽããããªãïŒããã¬ãã£ãã¯ã¹ã¯ç©ºïŒæåã®ãã©ã¡ãŒã¿ãŒïŒã§ãtodomvcJiant倿°ã¯ã¢ããªã±ãŒã·ã§ã³å®çŸ©ãã¡ã€ã«ïŒãã¥ãŒããã³ãã¬ãŒããç¶æ ãã€ãã³ããå«ãïŒã§å®çŸ©ãããã¢ãŒãããªã³ã«ããŸãéçºã
HTMLå®è£
ããã§ãã¹ãŠã§ããå®çŸ©ãã¡ã€ã«ãšã¹ã¿ãŒã¿ãŒã®ã¿ããããããžãã¯ã¯ãããŸããããã¢ããªã±ãŒã·ã§ã³ãèµ·åããã®ã¯æ¬åœã«çãã§ãã Chromeã§htmlãå®è¡ãããšã
- ãå±¥æŽãã©ã°ã€ã³ããã³ç¶æ ãæ§æãããŠããŸããã ç¶æ ã䜿çšãããã$ .Historyãã©ã°ã€ã³ã远å ããªãã§ãã ãã»
- æªå®çŸã®ã€ã³ã¿ãŒãã§ãŒã¹èŠçŽ ã«é¢ããã¡ãã»ãŒãžãå«ãå¥ã®ã¢ã©ãŒã
- ãããŠãã³ã³ãœãŒã«ã§2çªç®ã®ã¢ã©ãŒãã®ããã¹ããç¹°ãè¿ããŸãããªããžã§ã¯ãIDã®äžã®ã¯ã©ã¹ã«ãã£ãŠåç §ãããæ¢åã®ãªããžã§ã¯ããIDã«ãã£ãŠåç §ããã鿢åã®ãªããžã§ã¯ãã詳现ã«ã€ããŠã¹ã¿ãã¯ãã¬ãŒã¹ããã§ãã¯ãäºæ³ããããªããžã§ã¯ãIDïŒ
å±¥æŽã远å ããŸã-å«ãŸããŠããŸãã ããã§ãããšãã°æ¬¡ã®ããã«ãhtmlã¬ãã«ã§æœè±¡å®çŸ©ãå®è£ ããããšãã§ããŸãã
<section id="main"> <input id="toggle-all" class="batchToggleStateCtl" type="checkbox" style="display: none;"> <label for="toggle-all">Mark all as complete</label> <ul id="todo-list" class="todoList"> </ul> </section>
-èå¥åã¯ãã§ã«é 眮ãããŠãããå¿ èŠãªèŠçŽ ã«ã¯ã©ã¹ã远å ããŸãã ãã³ãã¬ãŒãã®å®è£ ïŒ
<div id="tmTodo" style="display: none;"> <li class="stateMarker"> <div class="view hiddenInEditMode"> <input class="toggle toggleStateCtl" type="checkbox"> <label class="editCtl titleLabel"></label> <button class="destroy deleteCtl"></button> </div> <input class="edit titleInput" value=""> </li> </div>
<script type = "someUnreadableTypeToFoolBrowser">ã«ãã³ãã¬ãŒããé 眮ããäžè¬çãªæ £è¡ãšã¯ç°ãªããJiantã¯æ£ããhtmlæ§é ã䜿çšããŸããããã¯ãscriptã¿ã°å ã«DOMã¢ãã«ããªããå®è£ ãžã®ãã³ãã¬ãŒããã£ãŒã«ãã®ãã€ã³ãã£ã³ã°ãæ€èšŒã§ããªãããã§ãã
æåŸã«ãJiantã¯ç¡é¢ä¿ãªèŠçŽ ã®ã¬ããŒãã忢ããŸãã;æœè±¡ã¢ããªã±ãŒã·ã§ã³ã¢ãã«ã¯å®è£ ã«äŸåããŠãããããã«äœ¿çšã§ããŸãã
ãã©ã°ã€ã³
Jiantã®ã€ããªãã®ãŒã«åŸããŸã-ããžãã¯ã¯ãã©ã°ã€ã³ã«ãã£ãŠè¿œå ãããŸãã æ°ãããã¥ãŒãŸãã¯ã€ãã³ãç¶æ ã衚瀺ãããå Žåãã¢ããªã±ãŒã·ã§ã³èšè¿°ãã¡ã€ã«ã«åœŒå¥³ã远å ããhtmlã«å®è£ ããŸãã ã€ãŸããã¢ããªã±ãŒã·ã§ã³ãæ¡åŒµããããã»ã¹ã¯åžžã«äžå®ã§å¶åŸ¡ãããŸããããã¯ãå°èŠæš¡ãªéçºããéå§ããå€§èŠæš¡ãªéçºã«ãšã£ãŠéåžžã«éèŠã§ãã
ã¢ãã«
åé¡ã¯ããã®ã¢ããªã±ãŒã·ã§ã³ã«éäžããŒã¿ã¢ãã«ãå¿ èŠãã©ããã§ãã çè«çã«ã¯ãåãã©ã°ã€ã³ã¯ç¬èªã®ã¢ãã«ãå«ã¿ãã¢ããªã±ãŒã·ã§ã³ã§çºçããã€ãã³ãã«åºã¥ããŠãããåæã§ããŸãã å®éã«ã¯ãæ¯èŒã®ããã«ãã®ãªãã·ã§ã³ãäœæããŸããããäºæ³ã©ãã-äžèŠã§å埩çãªã³ãŒãããããããããŸããã ãããã£ãŠãã¢ãã«ãå®è£ ããŸãïŒå®éã«ã¯ãå®è£ ãjsonã¢ããªã±ãŒã·ã§ã³èšè¿°ãã¡ã€ã«ã«çŽæ¥é 眮ããããšã¯å¯èœã§ãããèªã¿ã«ãããªããããã€ããªãã®ãŒã«åŸã£ãŠåå¥ã®ãã©ã°ã€ã³ãšããŠã¬ã³ããªã³ã°ããŸãïŒãmodel.jsïŒ
todomvcJiant.model.todo = (function($, app) { var todos = []; return { add: function(title, completed) { var todo = {title: title, completed: completed ? true : false}; todos.push(todo); app.events.todoAdded.fire(todo); return todo; }, remove: function(todo) { todos = $.grep(todos, function(value) {return value != todo;}); app.events.todoRemoved.fire(todo); return todo; }, getAll: function() { return todos; }, getCompleted: function() { return $.grep(todos, function(value) {return value.completed}); }, getActive: function() { return $.grep(todos, function(value) {return !value.completed}); } } })($, todomvcJiant);
æãåçŽãªé åããŒã¹ã®å®è£ ã ããã§ãã¢ããªã±ãŒã·ã§ã³ã®ã€ãã³ããããã€ãèµ·åããããšã«æ³šæããŠãã ããã ãã®å Žåãã¢ãã«ãjsonãããžã§ã¯ãã®èª¬æã«è¿œå ããã®ã¯è¡šé¢çãªãã®ã§ãïŒããšãã°ãgetActiveïŒïŒã¡ãœããã¯ãããŸããïŒãJiantã¯ããŒã¿ã¢ãã«ããŸã£ããæ±ããŸããã
ãã©ã°ã€ã³ã®å®è£
ããã«ã仿§ã®åããžãã¯èŠçŽ ã«å¯ŸããŠãç¬èªã®ãã©ã°ã€ã³ãäœæããŠè¿œå ããŸãã ãã€ã§ãããã¹ãŠãç§ãã¡ã®ããã«æ©èœããæ©èœã¯ä»ã«åœ±é¿ãäžããããšãªãæé·ããŸãã 以äžã«ããã€ãã®äŸã瀺ããŸããã³ãŒãå ã®ã³ã¡ã³ã
stateCtls.js
jiant.onUiBound(function($, app) { // API var ctlsView = app.views.footer, ctls = { "showActiveCtl": app.states.active, // "showCompletedCtl": app.states.completed, "showAllCtl": app.states[""] }; $.each(ctls, function(key, state) { ctlsView[key].click(function() { state.go(); }); state.start(function() { // ctlsView[key].addClass("selected"); }); state.end(function() { ctlsView[key].removeClass("selected"); }); }); });
footerVisibility.js
jiant.onUiBound(function($, app) { app.events.todoAdded.on(updateView); // app.events.todoRemoved.on(updateView); function updateView() { // todo , app.model.todo.getAll().length > 0 ? app.views.footer.show() : app.views.footer.hide(); } });
ä»ã®ãã©ã°ã€ã³ãåæ§ã«onUiBoundã䜿çšããŠè¿œå ãããŸãã ãã©ã°ã€ã³ãæ°ããAPIæ©èœãå¿ èŠãšããå Žåãæœè±¡çãªå®£èšãšå®è£ ãäœæããŸãã ãã®å Žåãã»ãšãã©ã®ãã©ã°ã€ã³ã§ã¯ããã©ã°ã€ã³ãã¹ããŒã¿ã¹ãæŽæ°ããããšã«å¿çããŠã°ããŒãã«ãªsmthChangedã€ãã³ãã®ãããªãã®ã倿ããŸããããããã¯å人çãªå¶ç¶ã§ãã
htmlã¯htmlãšããŠã®ã¿äœ¿çšãããã«ã¹ã¿ã 屿§ãã¿ã°ã¯äœ¿çšãããªãããšã«æ³šæããŠãã ããã UIãæäœããããã®ãã¹ãŠã®ããžãã¯ã¯ãjQuery颿°ã§èšè¿°ãããŠããŸãã
楜ããäºå®-ãªããžã§ã¯ãã®èå¥åãå ¥åããå¿ èŠã¯ãããŸããã§ããã ãã¹ãŠã®äœæ¥ã¯ããªããžã§ã¯ããžã®çŽæ¥ãªã³ã¯ãä»ããŠè¡ãããŸãã todoãªããžã§ã¯ãã®UIå®è£ ãžã®åç §ã¯ãtodoãªããžã§ã¯ãã®ãã£ãŒã«ããšããŠtodoRenderer.jså ã«ä¿åãããå€éšã®èª°ã«ã䜿çšããããé åºã¯ã¢ãã«å ã«ä¿åãããŸãã
PS
æåŸã®è¡ã«ãã¹ãŠãæžãããšããã¿ã¹ã¯ããã¹ãã倿ŽããåŸãæ¢åã®ã€ãã³ãã®ããã€ããçºçãããŸã§æ°ããããã¹ãã¯localStorageã«ä¿åãããªãããšã«æ°ä»ããŸããã ä¿®æ£ããããã«ãæ°ããã€ãã³ãtodoTitleModifiedã远å ããæ°ããããã¹ãïŒtodoRenderer.jsïŒãã€ã³ã¹ããŒã«ããåŸã«ãšãã£ã¿ãŒã§ã¹ããŒããsaveã¢ãžã¥ãŒã«ïŒpersistence.jsïŒã§ã€ãã³ãã«ãµãã¹ã¯ã©ã€ãããŸãã