ãã®ã¬ã€ããèªããšã次ã®ããšãã§ããããã«ãªããŸãã
- SproutCoreãã³ãã¬ãŒãã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®å€èŠ³ãèšè¿°ããŸãã
- ãã¥ãŒå ã®ã€ãã³ããåŠçããŸãã
- ã¢ãã«ã®ç¶æ ãå€æŽããåŸããã€ã³ãã£ã³ã°ã䜿çšããŠãã¥ãŒãæŽæ°ããŸãã
Todoãªã¹ãã¢ããªã®äœæäžã«ãããããã¹ãŠãåŠç¿ããŸãã
ãã®ã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹ã³ãŒãã¯Githubã§å ¥æã§ããŸãã ã¹ã¯ãªãŒã³ãã£ã¹ãããããŸãã
1 SproutCoreã®ã€ã³ã¹ããŒã«
ãã§ã«SproutCoreãã€ã³ã¹ããŒã«ãããŠããããšãåæã§ãããã以å€ã®å Žåã¯ã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
å ¬åŒã®SproutCore Webãµã€ãããã€ã³ã¹ããŒã©ãŒãããŠã³ããŒãããããRubyGemsã³ãã³ãgem install sproutcoreã䜿çšããŠã€ã³ã¹ããŒã«ã§ããŸãã
ã¡ãªã¿ã«ãSproutCoreã¯rubyã§èšè¿°ãããŠãããããã€ã³ã¹ããŒã©ãŒã¯rubyã€ã³ã¿ãŒããªã¿ãŒãã€ã³ã¹ããŒã«ããŸãã éçºãå®äºããããã¢ããªã±ãŒã·ã§ã³ããã«ãã§ããŸããRubyã¯äžèŠã«ãªããŸããããã以éã¯ããã«å¿ èŠã«ãªããŸãã
RubyGemsã䜿çšããŠã€ã³ã¹ããŒã«ããã®ã§ãåé¡ã¯ãããŸããã§ããã
2æ°ããã¢ããªã±ãŒã·ã§ã³ã®äœæ
ãŸãã次ã®ã³ãã³ãã䜿çšããŠHTMLã¢ããªã±ãŒã·ã§ã³ãçæããŸãã
$ sc-init todos --template
ãã®ãŠãŒãã£ãªãã£ã¯ã apps / todosãã£ã¬ã¯ããªã«ããã€ãã®ãã¡ã€ã«ãäœæããŸãã
ã¢ããª/
ããã¹/
todos.jsã¯ãã¢ãã«ããã¥ãŒãã³ã³ãããŒã©ãŒãå®çŸ©ããJavaScriptãã¡ã€ã«ã§ãã
ãªãœãŒã¹/
ãã³ãã¬ãŒã/ -ããã«ã¢ããªã±ãŒã·ã§ã³ãã³ãã¬ãŒããå«ãŸããŠããŸãã
todos.handlebars-ã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ãã³ãã¬ãŒãã
images / -ããã«ã¯ç»åãå«ãŸããŸãã
ã¹ã¿ã€ã«ã·ãŒã/ -ãããŠããããã¹ã¿ã€ã«ã§ãã
todos.cssã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ã¹ã¿ã€ã«ã·ãŒãã§ãã
ãã¹ã/
Buildfile-ã¢ããªã±ãŒã·ã§ã³ããã«ãããããã®ã³ãã³ããå«ãŸããŠããŸãã ã»ãšãã©ã®å Žåãããã©ã«ãã®ãã¡ã€ã«ã䜿çšã§ããŸãã
README-ãããžã§ã¯ãã®èª¬æã
ãã¡ã€ã«apps / todos / todos.jsãéããšã次ã®ããã«è¡šç€ºãããŸã
Todos = SC.Application.create(); SC.ready(function() { Todos.mainPane = SC.TemplatePane.append({ layerId: "todos", templateName: "todos" }); });
ãã®ã³ãŒãã¯ãã¢ããªã±ãŒã·ã§ã³ã®åå空éïŒãã®å Žåã¯ãTodosãïŒãäœæããæ°ããããã«ãè¿œå ããŸãã
ããã«ã¯ã€ãã³ããå§ä»»ãããã³ãã¬ãŒããDOMã«é 眮ããŸãããããã«ã€ããŠã¯åŸã§èª¬æããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®çæäžã«ååã«å€§æåãå«ãŸããŠããå ŽåïŒToDoãªã©ïŒãåå空éã¯ToDoãšåŒã°ãã
ãã£ã¬ã¯ããªåã«ã¯ã¢ã³ããŒã¹ã³ã¢ãå«ãŸããŸãïŒäžèšã®äŸã§ã¯ãapps / to_dosïŒã
3ã¢ãã«ã®çºè¡š
ToDoãªã¹ããäœæããããããŠãŒã¶ãŒã¯ãªã¹ãã«ã¿ã¹ã¯ãè¿œå ããããå®äºããã¿ã¹ã¯ã«ããŒã¯ãä»ãããããããšãã§ããŸãã
ã¢ãã«ãSC.Objectã®æ°ãããµãã¯ã©ã¹ãšããŠå®çŸ©ããŸãã
ããã§ã apps / todos / todos.jsãã¡ã€ã«ã¯æ¬¡ã®ããã«ãªããŸã ã
Todos = SC.Application.create(); Todos.Todo = SC.Object.extend({ title: null, isDone: false }); SC.ready(function() { Todos.mainPane = SC.TemplatePane.append({ layerId: 'todos', templateName: 'todos' }); });
Todosãªããžã§ã¯ããäœæããåŸãã¢ãã«å®çŸ©ã«åŸãå¿ èŠãããããšã«æ³šæããŠãã ããã
ããã§ã2ã€ã®ã¿ã€ãã«ããããã£-stringããã³isDone-ããŒã«å€ãæã€ã¢ãã«ã¯ã©ã¹ãã§ããŸããã
4ã³ã³ãããŒã©ãŒã䜿çšããã¢ãã«ã®å¶åŸ¡
ã¢ãã«ã䜿çšããŠããŒã¿ãèšè¿°ãããã®ã§ãããã管çããã³ã³ãããŒã©ãŒãäœæããŸãã ã¿ã¹ã¯ã®é åºä»ããªã¹ããå¿ èŠãªã®ã§ãSC.ArrayControllerã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã䜿çšããŸãã
apps / todos / todos.jsãã¡ã€ã«ã®æåŸã«ã次ãè¿œå ããŸãã
Todos.todoListController = SC.ArrayController.create({ // . content: [] });
SproutCoreã®ãããªMVCãã¬ãŒã ã¯ãŒã¯ã§ã¯ãã³ã³ãããŒã©ãŒã¯ã¢ãã«ïŒããŒã¿ã®åŠçãæ åœïŒãšãã¥ãŒïŒããŒã¿ã®è¡šç€ºãæ åœïŒã®éã®ããªããžã§ãã
ããã§ãããŒã¿ã®ãªãã³ã³ãããŒã©ãŒãã§ããŸãããæ°ããã¿ã¹ã¯ãäœæããã¡ãœãããè¿œå ããŸãã apps / todos / todos.jsãã¡ã€ã«ã®ä»¥åã®ã³ãŒããæŽæ°ããŸã ã
Todos.todoListController = SC.ArrayController.create({ // . content: [], // , . createTodo: function(title) { var todo = Todos.Todo.create({ title: title }); this.pushObject(todo); } });
SC.ArrayControllerã¯ãé åã®ã³ã³ãã³ãã«å¯Ÿãããããã·ãšããŠæ©èœããŸãã SproutCoreã¯ãArrayControllerã«å ãããããã¹ãŠã®å€æŽãé åã®å 容ã«çŽæ¥é©çšããŸãã
5ããã¹ãããã¯ã¹ã䜿çšããŠæ°ããã¿ã¹ã¯ãäœæããŸãã
ãã®äŸã®ããã«CSSãã¡ã€ã«ãçšæãããŸããã ãã¡ãããããŠã³ããŒãã§ããŸãã
apps / todos / resources / stylesheets / todos.cssã«ããã¢ããªã±ãŒã·ã§ã³äœæãŠãŒãã£ãªãã£ã«ãã£ãŠçæããã空ã®ãã¡ã€ã«ã«çœ®ãæããŸãã
ã¢ãã«ãšãããæäœããããã«æ§æãããã³ã³ãããŒã©ãŒããããŸãã次ã«ãæãèå³æ·±ãéšåã§ãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®äœæã«åãããããŸãããã ãŸãããŠãŒã¶ãŒãäœæããã¿ã¹ã¯ã®ååãå ¥åã§ããããã¹ããã£ãŒã«ããäœæããŸãã
SproutCoreã¯Handlebarsã䜿çšããŠãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãã¿ãŒã³ãèšè¿°ããŸãããããã¯å©äŸ¿æ§ãé«ããããã«å°ãæ¡åŒµãããŠããŸãã
ãã¥ãŒã®æäœãéå§ããã«ã¯ã resources / templates / todos.handlebarsãã¡ã€ã«ãéããŸã ã
次ã®ãã®ãå«ãŸããŸãã
<h1>Welcome to SproutCore!</h1>
å 容ã次ã®ãã®ã«çœ®ãæããŸãã
<h1>Todos</h1> <input id="new-todo" type="text" placeholder=" ?" >
ãã³ãã«ããŒã®äœ¿çšã®è©³çŽ°ã«ã€ããŠã¯ããããã¯ãªãã¯ããŠãã ãã ã SproutCoreã§Handlebarsã䜿çšããæ¹æ³ã®è©³çŽ°ã«ã€ããŠã¯ã ãã¡ããã芧ãã ãã ã
ã¢ãã«ãã³ã³ãããŒã©ãŒããã¥ãŒãã§ããã®ã§ããã©ãŠã¶ãŒã§ã¢ããªã±ãŒã·ã§ã³ãéããã©ã®ããã«èŠãããã確èªããŸãã éçºããã»ã¹ãç°¡çŽ åããããã«ãsc-serverãŠãŒãã£ãªãã£ããããŸãã ãã®ã³ãã³ãã¯ãã¢ããªã±ãŒã·ã§ã³ãé 眮ãããŠãããã£ã¬ã¯ããªããå®è¡ããå¿ èŠããããŸãã
$ sc-server
Starting server at 0.0.0.0:4020 in debug mode
To quit sc-server, press Control-C
>> Thin web server (v1.2.1 codename Bat-Shit Crazy)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:4020, CTRL+C to stop
Webãã©ãŠã¶ãŒãéãã httpïŒ// localhostïŒ4020 / todosã«ç§»åããŸãã ããªãã®åµé ãè³è³ããŠãã ããã ã¢ããªã±ãŒã·ã§ã³ãåäœããŠããããšã確èªããããSproutCoreã«ã¿ã°ã€ãã³ãã®åŠçæ¹æ³ãæ瀺ããŸãã ãŠãŒã¶ãŒãã¿ã¹ã¯ã®ååãå ¥åããŠEnterããŒãæŒããšãæ°ããã¿ã¹ã¯ãäœæãããã¿ã¹ã¯é åã«è¿œå ãããŸãã
SproutCoreã§ã¯ããã¥ãŒã¯DOMããªãŒã®æŽæ°ãšã€ãã³ãã®åŠçãæ åœããŸãã ããã«ãDOMã®å€æŽããããã¡ãªã³ã°ããŠããã©ãŒãã³ã¹ãåäžããããŠãããŒãµã«ã¯ãã¹ãã©ãããã©ãŒã ã€ãã³ãåŠçããµããŒãããããšãã§ããŸãã 衚瀺ããå¿ èŠããããšãã¯ãã€ã§ã
åçã³ã³ãã³ãã®å Žåã¯ããã¥ãŒãªããžã§ã¯ãã䜿çšããå¿ èŠããããŸãã
SC.readyé¢æ°ãåŒã³åºãåã«ã次ã®ã³ãŒããapps / todos / todos.jsãã¡ã€ã«ã«è¿œå ããŸãã
Todos.CreateTodoView = SC.TextField.extend({ insertNewline: function() { var value = this.get('value'); if (value) { Todos.todoListController.createTodo(value); this.set('value', ''); } } });
CreateTodoViewã«ããã¹ããã£ãŒã«ããå«ãŸããå ŽåãSC.TextFieldã®ãµãã¯ã©ã¹ãäœæããŸããããã«ãããããã¹ããã£ãŒã«ããæäœããããã®äŸ¿å©ãªæ©èœãããã€ãæäŸãããŸãã ããšãã°ãããããã£å€ã«ã¢ã¯ã»ã¹ããinsertNewlineãªã©ã®é«ã¬ãã«ã®ã€ãã³ãããã®ãªã¯ãšã¹ãã«å¿çã§ããŸãã
ãŠãŒã¶ãŒãEnterãæŒãããšãã ãã¥ãŒãå®çŸ©ããã®ã§ããã³ãã¬ãŒãã«å«ããå¿ èŠããããŸãã
ãã¡ã€ã«apps / todos / resources / templates / todos.handlebarsã«å€æŽãå ããŸãã
<h1>Todos</h1> {{#view Todos.CreateTodoView}} <input id="new-todo" type="text" placeholder=" ?" /> {{/view}}
#viewã¯ãSC.TemplateViewãšHTMLèŠçŽ ããªã³ã¯ããHelper Handlebarsãã«ããŒïŒãã«ããŒãŸãã¯ãã«ããŒ- 奜ããªãã®ïŒã§ãã ã€ãŸãããã¥ãŒã«èšè¿°ãããŠããåäœïŒã€ãã³ãåŠçãªã©ïŒã¯ã ïŒviewãããã¯å ã®HTMLèŠçŽ ã«é¢é£ä»ããããŸãã
æ°ããã¿ã¹ã¯ãäœæããããã®ã€ã³ã¿ãŒãã§ã€ã¹ãã§ããã®ã§ããããã衚瀺ããããã®ã€ã³ã¿ãŒãã§ã€ã¹ãäœæããŸãã
#collectionãããã¯ã䜿çšããŠãªã¹ãã衚瀺ããŸãã #collectionã¯ãSC.TemplateCollectionViewã®ã€ã³ã¹ã¿ã³ã¹ãäœæãã ïŒcollectionãããã¯å ã®HTMLã³ãŒãã«åŸã£ãŠåãªã¹ãé ç®ã衚瀺ããŸãã
ãã¡ã€ã«apps / todos / resources / templates / todos.handlebarsã®æåŸã«æ¬¡ã®ã³ãŒããè¿œå ããŸãã
{{#collection SC.TemplateCollectionView contentBinding="Todos.todoListController"}} {{content.title}} {{/collection}}
todoListControllerã®ã³ã³ãã³ãã«ã³ã¬ã¯ã·ã§ã³ãã€ã³ãã£ã³ã°ã宣èšããŸããã
ããã§ãé åã®åèŠçŽ ã{{content.title}}ãã³ãã¬ãŒãã«åŸã£ãŠè¡šç€ºãããŸãã
ãã€ã³ãã£ã³ã°ãäœæããã«ã¯ãååãBindingã§çµããããããã£ã宣èšããå¿ èŠãããããšã«æ³šæããŠãã ããã ãã®å Žåãcontentããããã£ã¯Todos.todoListControllerã«ãã€ã³ããããcontentããããã£ãžã®ãã¹ãŠã®å€æŽã«ãããTodos.todoListControllerãå€æŽãããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®httpïŒ// localhostïŒ4020 /ãã©ãŠã¶ã®todosãã芧ãã ããã 以åãšåãããã«èŠããŸãããã¿ã¹ã¯ã®ååãããã¹ãããã¯ã¹ã«å ¥åããŠEnterããŒãæŒããšãããã¹ãããã¯ã¹ã®äžã®ãªã¹ãã«èªåçã«è¿œå ãããŸãã
ãã€ã³ãã£ã³ã°ãŸãã¯ãã€ã³ãã£ã³ã°ã¯ãSproutCoreã®ããŒã¿ãæäœããããã®äž»èŠãªããŒã«ã§ãã ããŒã¿ãšãã£ã¹ãã¬ã€ã®åæãšããæ±ãä»äºããã¹ãŠããŸãã
6ã¿ã¹ã¯å®äºããŒã¯
ã¿ã¹ã¯ãè¿œå ããããšã¯ã§ããŸãããå®äºãããŒã¯ããæ¹æ³ã¯ãããŸããã ãã®æ©èœãè¿œå ããŸãããã
æåã«è¡ãããšã¯ãã¿ã¹ã¯ãªã¹ãã®åã¢ã€ãã ã«ãã§ãã¯ããã¯ã¹ãè¿œå ããããšã§ãã åè¿°ã®ããã«ãã€ãã³ãïŒããšãã°ããŠãŒã¶ãŒå ¥åïŒãåŠçããã«ã¯ããã®åŠçãå¿ èŠãªHTMLã®éšåã«ãã¥ãŒãªããžã§ã¯ããé©çšããå¿ èŠããããŸãã ãã®å Žåããã§ãã¯ããã¯ã¹ãè¿œå ãããŠãŒã¶ãŒãã¹ããŒã¿ã¹ãå€æŽãããã³ã«éç¥ãåä¿¡ããŸãã #viewãã«ããŒã䜿çšããŠãã¥ãŒãšHTMLã³ã³ãã³ãããªã³ã¯ã§ããããšãå¿ããªãã§ãã ããã åæã«ãæã ã¯åç §ããããšãã§ããŸã
ãã¥ãŒãã«ããŒã䜿çšããŠããŒã¿ã衚瀺ããHTMLèŠçŽ ã®ç¹å®ã®ãªããžã§ã¯ãïŒïŒããªãããšã«æ³šæããŠãã ããïŒã ããšãã°ãè€éãªãã¥ãŒãäœæã§ããŸã
ããã¯æ°å䜿çšãããŸãã ãã®å ŽåãèŠçŽ ã®1ã€ãæŽæ°ããå¿ èŠããããšãã«ãã¹ãŠã®ãã³ãã¬ãŒããæŽæ°ããå¿ èŠã¯ãããŸããã
apps / todos / resources / templates / todos.handlebarsãã¡ã€ã«ã®ä»¥åã®ã³ãŒãã次ã®ã³ãŒãã«çœ®ãæããŸãã
{{#collection SC.TemplateCollectionView contentBinding="Todos.todoListController"}} {{view Todos.MarkDoneView}} {{/collection}}
次ã«ããã³ãã¬ãŒãã§åç §ããTodos.MarkDoneViewã«ã€ããŠèª¬æããŸãã ãã¥ãŒã«ãã§ãã¯ããã¯ã¹ãå«ãŸããå ŽåãSC.Checkboxã®ãµãã¯ã©ã¹ã宣èšããŸããããã¯ãå€ãšã¿ã€ãã«ã®ããããã£ããã¥ãŒã«æž¡ããŸãã
SproutCoreã¯ãå€æŽã€ãã³ããã³ãã©ãŒããã€ã³ããããã³ãã©ãŒã®çµäºæã«å€ãæŽæ°ããŸãã ããŸããŸãªãã©ãŠã¶ã§ããã®ã¿ã¹ã¯ã¯ããŸããŸãªæ¹æ³ã§å®è£ ã§ããŸãããSproutCoreã¯ãããã®åé¡ããããªããæããŸãã
SC.TemplateCollectionViewãªã¹ãã®åèŠçŽ ã«å¯ŸããŠãã³ã³ãã³ãããããã£ã«ãã¥ãŒãªããžã§ã¯ããå«ãŸããåãã¥ãŒãäœæããŸãã ç§ãã¡ã®å Žåãããã¯åã¿ã¹ã¯ã®åãã¥ãŒã«ãªããã³ã³ãã³ãããããã£ã®å€ã¯ç¹å®ã®ã¿ã¹ã¯ã®ã³ã³ãã³ãã«ãã€ã³ããããŸãã
ããã«ããããã§ãã¯ããã¯ã¹ã®ããããã£ãšãªããžã§ã¯ãã®ããããã£ãç°¡åã«ãªã³ã¯ã§ããŸãã ãã®å Žåãvalueããããã£ïŒãã§ãã¯ããã¯ã¹ïŒãïŒãªããžã§ã¯ãã®ïŒisDoneããããã£ã«ãã€ã³ãããtitleããããã£ïŒãã§ãã¯ããã¯ã¹ïŒãïŒãªããžã§ã¯ãïŒã®titleããããã£ã«ãã€ã³ãããŸãã
SC.readyé¢æ°ãåŒã³åºãåã«ã次ã®ã³ãŒããapps / todos / todos.jsãã¡ã€ã«ã«è¿œå ããŸãã
Todos.MarkDoneView = SC.Checkbox.extend({ titleBinding: '.parentView.content.title', valueBinding: '.parentView.content.isDone' });
ã¿ã¹ã¯ãªã¹ãã®å€èŠ³ããŠããŒã¯ã«ããããã«ãCSSãã¡ã€ã«ã«ã¯ã¢ã¯ãã£ããªã¿ã¹ã¯ãšå®äºããã¿ã¹ã¯ã®ããŸããŸãªã¯ã©ã¹ãå«ãŸããŠããŸãã ã¯ã©ã¹ããããã£ïŒãã§ãã¯ããã¯ã¹ïŒãšisDoneããããã£ïŒãªããžã§ã¯ãã®ïŒããã€ã³ãããŸãããã
ãã¡ã€ã«apps / todos / resources / templates / todos.handlebarsã®ã¿ã¹ã¯ãªã¹ãã衚瀺ããããã®ã³ãŒãã次ã®ããã«çœ®ãæããŸãã
{{#collection SC.TemplateCollectionView contentBinding="Todos.todoListController" itemClassBinding="content.isDone"}} {{view Todos.MarkDoneView}} {{/collection}}
é¢é£ãããªããžã§ã¯ãã®isDoneããããã£ãtrueã®å ŽåãåèŠçŽ ã¯is-doneã¯ã©ã¹ãåãåããŸãã SproutCoreã¯ãããããã£åã«åºã¥ããŠã¯ã©ã¹åãèªåçã«çæããŸãã
åãã¥ãŒã«ã¯ãIDãã¯ã©ã¹ãclassBindingãªã©ã®å€æ°ã®ããããã£ããããŸãã ã³ã¬ã¯ã·ã§ã³ãã«ããŒã䜿çšãããšããã¹ãŠã®åãã¥ãŒã«ãé©çšãããèŠçŽ ã«ãããã®ããããã£ãè¿œå ã§ããŸãã ããšãã°ãã³ã¬ã¯ã·ã§ã³ã§itemClassããããã£ãå®çŸ©ããå ŽåãåèŠçŽ ã«ã¯ã¯ã©ã¹ããããã£ããããŸãã
ãã©ãŠã¶ã§ã¢ããªã±ãŒã·ã§ã³ãåèµ·åããã¿ã¹ã¯ã«å®äºã®ããŒã¯ãä»ããããšãããšãã¿ã¹ã¯ããã¹ãã¯ããã«æ¶ãããŸãã é åã®èŠçŽ ã®isDoneããããã£ãå€æŽããããšã察å¿ããHTMLèŠçŽ ã®å€èŠ³ãå€æŽãããŸãã SproutCoreã¯ãããèªåçã«è¡ããŸãã
7詳现ãã芧ãã ãã
ã¿ã¹ã¯ãè¿œå ããå®äºããã¿ã¹ã¯ã«ããŒã¯ãä»ããããšãã§ããŸãã ããã§ããªã¹ãããæ å ±ãæœåºã§ããŸããïŒ ãªã¹ãã®äžéšã«æªåŠçã®ã¿ã¹ã¯ã®æ°ã衚瀺ããŸãããã
apps / todos / resources / templates / todos.handlebarsãéã ãTodos.CreateTodoViewã®åŸã«æ°ãããã¥ãŒèŠçŽ ãè¿œå ããŸãã
{{#view Todos.StatsView id="stats"}} {{displayRemaining}} {{/view}}
åŒ{{displayRemaining}}ã¯ãTodos.StatsViewã®displayRemainingããããã£ãå€æŽããããšèªåçã«DOMãæŽæ°ããŸãã
SC.readyãåŒã³åºãåã«ããã¥ãŒã®èª¬æãapps / todos / todos.jsãã¡ã€ã«ã«è¿œå ããŸã ã
Todos.StatsView = SC.TemplateView.extend({ remainingBinding: 'Todos.todoListController.remaining', displayRemaining: function() { var remaining = this.get('remaining'); return (remaining === 1 ? remaining +" " : " : "+remaining); }.property('remaining') });
displayRemainingã«ã¯ãæ®ãã®ã¿ã¹ã¯ã®æ°ã«åºã¥ããè€æ°ã®æååãå«ãŸããŸãã èšç®ããããã£ãšåŒã°ãããåäœäžã®å¥ã®åºæ¬çãªSproutCoreããŒã«ã次ã«ç€ºããŸãã èšç®ãããããããã£ã¯ãå€ãé¢æ°ã䜿çšããŠæ±ºå®ãããããããã£ã§ãã
å®äºããŠããªãã¿ã¹ã¯ã®å®éã®æ°ãååŸããã«ã¯ã察å¿ããããããã£ãã³ã³ãããŒã©ãŒã«è¿œå ããŸãã
apps / todos / todos.jsãã¡ã€ã«ã§ã次ã®ããã«ã³ãŒããæŽæ°ããŸãã
Todos.todoListController = SC.ArrayController.create({ // ... remaining: function() { return this.filterProperty('isDone', false).get('length'); }.property('@each.isDone') });
ãã®å ŽåãäŸåããŒeachã䜿çšããŸãã ãããã£ãŠãé åã®ä»»æã®èŠçŽ ã®isDoneããããã£ã®å€æŽãžã®äŸåã宣èšããŸãã åããŒã®ããããã£ããã¢ã€ãã ãè¿œå ãŸãã¯åé€ãããšãã«æŽæ°ãããŸãã äŸåããŒã宣èšããå¿ èŠããããŸãããªããªã SproutCoreã¯ãããã䜿çšããŠãã€ã³ãã£ã³ã°ãæŽæ°ããŸãã ä»çµã¿ã¯æ¬¡ã®ãšããã§ãã

8å®äºããã¿ã¹ã¯ã®åé€
ã¢ããªã±ãŒã·ã§ã³ã䜿çšããå Žåãå®äºããã¿ã¹ã¯ãå®æçã«åé€ããå¿ èŠããããŸãã ãç解ã®ãšãããtodoListControllerãå€æŽããŠãSproutCoreããããã®å€æŽãèªåçã«è¡šç€ºããããã«ããŸãã
ãããè¡ãã«ã¯ãclearCompletedTodosã¡ãœãããã³ã³ãããŒã©ãŒã«è¿œå ããŸãã
apps / todos / todos.jsãã¡ã€ã«ã§ ãã³ãŒãã次ã®ããã«æŽæ°ããŸãã
Todos.todoListController = SC.ArrayController.create({ // ... clearCompletedTodos: function() { this.filterProperty('isDone', true).forEach(this.removeObject, this); } });
次ã«ããã³ãã¬ãŒãã«ãã¿ã³ãè¿œå ããŸãã
ã¢ããª/ todos /ãªãœãŒã¹/ãã³ãã¬ãŒã/ todos.handlebarsãéã ãStatsViewsã®ãã¿ã³ãè¿œå ããŸãã
{{#view Todos.StatsView id="stats"}} {{#view SC.Button classBinding="isActive" target="Todos.todoListController" action="clearCompletedTodos"}} {{/view}} {{displayRemaining}}. {{/view}}
ã¯ãªãã¯ãããšãªããžã§ã¯ãã®ã¡ãœãããåŒã³åºãSC.Buttonã®ã€ã³ã¹ã¿ã³ã¹ãå®çŸ©ããŸããã ãã®äŸã§ã¯ãTodos.todoListControllerãªããžã§ã¯ãã®clearCompletedTodosã¡ãœãããåŒã³åºããã¿ã³ãäœæããŸããã ãŸãããã¿ã³ãã¯ãªãã¯ãããšãã«ãis-activeã¯ã©ã¹ãè¿œå ããå¿ èŠãããããšãçºè¡šããŸããã ããã«ãããæŒãããã¿ã³ã®å€èŠ³ãå€æŽã§ããŸãã
ããã§ãã¢ããªã±ãŒã·ã§ã³ã®ããŠã³ããŒããã¿ã¹ã¯ã®è¿œå ãå®äºããã¿ã¹ã¯ã®æ°ã®ããŒã¯ä»ãããªã¹ãããã®åé€ãè©Šã¿ãŸãã ã芧ã®ãšããããã¹ãŠãæ©èœããŸãã
9ãã¹ãŠãããŒã¯
ãã¹ãŠã®ã¿ã¹ã¯ãå®äºæžã¿ãšããŠããŒã¯ããããšã«ãããšããŸãã ä»ã§ã¯é£ãããããŸãã äž»ãªäœæ¥ã¯ãã§ã«å®äºããŠããŸãã
allAreDoneã¡ãœãããtodoListControllerã«è¿œå ããŸãã apps / todos / todos.jsãã¡ã€ã«ã®ã³ãŒãã次ã®ããã«æŽæ°ããŸãã
Todos.todoListController = SC.ArrayController.create({ // ... clearCompletedTodos: function() { this.filterProperty('isDone', true).forEach(this.removeObject, this); } });
SproutCoreã«ã¯å€ãã®åæå¯èœãªãã«ããŒããããŸãã everyPropertyïŒ 'isDone'ãtrueïŒã¯ãé åå ã®åèŠçŽ ãtrueã«çããisDoneããããã£ãæã£ãŠããå Žåã«trueãè¿ããŸãã 詳现ã«ã€ããŠã¯ã ããã¥ã¢ã«ãåç §ããŠãã ãã ã
次ã«ããã©ã°ãäœæããŠãå®äºãããã¹ãŠã®ã¿ã¹ã¯ãããŒã¯ãããã®å€ãã³ã³ãããŒã©ãŒã®ããããã£ã«é¢é£ä»ããŸãã Todos.StatsViewã®çŽåŸã®ãã¡ã€ã«apps / todos / resources / templates / todos.handlebarsã«ä»¥äžãè¿œå ããŸãã
{{view SC.Checkbox class="mark-all-done" title=" " valueBinding="Todos.todoListController.allAreDone"}}
ããã§ã¢ããªã±ãŒã·ã§ã³ãããŠã³ããŒããããã¹ãŠã®ã¿ã¹ã¯ãå®äºæžã¿ãšããŠããŒã¯ããããšãããšãããã¹ãŠå®äºããã§ãã¯ããã¯ã¹ãèªåçã«ç¶æ ãå€æŽããããšãããããŸãããéæ¹åã«ã¯æ©èœããŸããã ããã¹ãŠå®è¡ããã§ãã¯ããã¯ã¹ãã¯ãªãã¯ãããšãã¿ã¹ã¯ãªã¹ãã¯å€æŽãããŸããã ãã©ã°ãæ£åžžã«æ©èœãããããã«ãtodoListControllerã®allAreDoneã¡ãœãããæžãæããŸãã
apps / todos / todos.jsãã¡ã€ã«ã®ã³ãŒãã次ã®ããã«æŽæ°ããŸãã
Todos.todoListController = SC.ArrayController.create({ // ... allAreDone: function(key, value) { if (value !== undefined) { this.setEach('isDone', value); return value; } else { return this.get('length') && this.everyProperty('isDone', true); } }.property('@each.isDone') });
èšç®ãããããããã£ã«å€ãå²ãåœãŠãããšãããšãããŒãšå€ã®ãã©ã¡ãŒã¿ãŒã§ããããã£é¢æ°ãåŒã³åºãããŸãã ããã¯ãã®äŸã§äœ¿çšãããã®ã§ãããã©ã°ãã¯ãªãã¯ãããšãSproutCoreã¯ããããallAreDoneããããã£ãå€æŽããããšããããããã®åŒã³åºããã€ã³ã¿ãŒã»ããã§ããŸãã
ããã§ãã¢ããªã±ãŒã·ã§ã³ã¯æå³ãããšããã«åäœããŸãã
ã¢ãã€ã«åãã®10ã®ã¹ã¿ã€ã«
ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãããããã¿ã€ãã®ææ°ã®ã¢ãã€ã«ããã€ã¹ã§å®å šã«æ©èœãããšèŠãªãããšãã§ããŸãã ããŸããŸãªç»é¢è§£å床ã«åãããŠæé©åããŸãããã ããã§CSSãã¡ã€ã«ãããŠã³ããŒãããŠãååãä»ããŠä¿åããŸã
apps / todos / resources / stylesheets / todos_mobile.css ã¢ãã€ã«ããã€ã¹ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãéããšãã¢ãã€ã«ããã€ã¹å°çšã«èšèšãããã¢ããªã±ãŒã·ã§ã³ã衚瀺ãããŸãã
SproutCoreã®ç¿åŸã«æåããŸããã
ãªãªãžãã«èšäº ã