
рдпрд╣ рдкреЛрд╕реНрдЯ рдЙрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ рдЬреЛ
рдпрд╣рд╛рдВ рд╢реБрд░реВ рд╣реБрдИ (рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдХреЛ рдЕрд╡рд╢реНрдп рдкрдврд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдЖрдЬ рд╣рдо рддрдерд╛рдХрдерд┐рдд "рдЯреВ-рдбреВ рд▓рд┐рд╕реНрдЯ" (рдЯреЛрдбреЛ-
рдПрдорд╡реАрд╕реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдЯреЛрдбреЛ-рд▓рд┐рд╕реНрдЯ)
рдмрдирд╛рдПрдВрдЧреЗ ред
рдХреЛрдгреАрдп рдкрд░ рдмрдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдФрд░
рдбрд░реНрдмреА рдкрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред
рдХрд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЕрдиреНрд╡реЗрд╖рдг рдХрд░реЗрдВ
рддреЛ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдгреАрдп рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХреНрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП 5 рдорд┐рдирдЯ рдЦрд░реНрдЪ рдХрд░реЗрдВ):
- рдПрдХ рдирдпрд╛ рдХрд╛рд░реНрдп рдКрдкрд░реА рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдЙрд╕ рд╕реВрдЪреА рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрдк рдПрдВрдЯрд░ рджрдмрд╛рддреЗ
enter
; - рд╕реВрдЪреА рдХреЗ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдХреЛ рдХрд╛рд░реНрдп рдХреЗ рджрд╛рдИрдВ рдУрд░ "рдХреНрд░реЙрд╕" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрджрд┐ рдЖрдк рдХрд╛рд░реНрдп рдкрд░ рдордВрдбрд░рд╛рддреЗ рд╣реИрдВ);
- рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рдИрдВ рдУрд░ "рдЪреЗрдХрдорд╛рд░реНрдХ" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ "рдкреВрд░реНрдг" рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЖрдк рдмреЙрдХреНрд╕ рдХреЛ рдЕрдирдЪреЗрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ);
- рдЬрдм рдЖрдк рдХрд╛рд░реНрдп рдкрд░ рдбрдмрд▓-рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рдВрдкрд╛рджрди рдореЛрдб рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ, рджрд╛рдПрдВ, рдПрдВрдЯрд░ рджрдмрд╛рдПрдВ - рдпрд╣ рдЕрдкрдбреЗрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИ;
- рдпрджрд┐ рд╣рдордиреЗ рдХрд╛рд░реНрдп рдкреВрд░реНрдг рдХрд░ рд▓рд┐рдП рд╣реИрдВ, рддреЛ рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрдг рдмрдЯрди рдиреАрдЪреЗ рджрд╛рдИрдВ рдУрд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ; рдпрджрд┐ рдЖрдк рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреВрд░реНрдг рдХрд╛рд░реНрдп рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗ
- рдпрд╣ рдкреВрд░реНрдг рдФрд░ рд╕рдХреНрд░рд┐рдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЧрд┐рдирддрд╛ рд╣реИ (рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ)ред рд╕реНрдерд┐рддрд┐ рдкрдЯреНрдЯреА рдореЗрдВ рдиреАрдЪреЗ;
- рдиреАрдЪреЗ рднреА, рд╕реНрдерд┐рддрд┐ рд░реЗрдЦрд╛ рдореЗрдВ 3 рд▓рд┐рдВрдХ рд╣реИрдВ (рд╕рднреА, рд╕рдХреНрд░рд┐рдп, рдкреВрд░реНрдг, рдХреНрд░рдорд╢рдГ url рдХреЛ рдмрджрд▓рдХрд░ '# /', '# / рд╕рдХреНрд░рд┐рдп' рдФрд░ '# / рдкреВрд░реНрдг'), рдЙрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рд╣рдо рдХрд╛рд░реНрдп рдлрд╝рд┐рд▓реНрдЯрд░ рдмрджрд▓рддреЗ рд╣реИрдВ: рдпрд╛ рддреЛ рд╕рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдХрд╛рд░реНрдп, рдпрд╛ рддреЛ рдХреЗрд╡рд▓ рд╕рдХреНрд░рд┐рдп (рдкреВрд░реНрдг рдирд╣реАрдВ) рдпрд╛ рдХреЗрд╡рд▓ рдкреВрд░реНрдг;
рд╣рдо рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рд▓реЗрдВрдЧреЗ
рд╣рдорд╛рд░реЗ рд▓рдХреНрд╖реНрдпреЛрдВ (рдмреЗрд╣рддрд░ рдбрд░реНрдмреАрдЬ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдпрд╣рд╛рдВ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖрдПрдВрдЧреЗ, рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯреВрдбреЛ рдПрдорд╡реАрд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдмрд╕
рд╕реАрдПрд╕рдПрд╕ рдлрд╝рд╛рдЗрд▓ рд▓реЗ рд▓реЛред рдЗрд╕ рдкрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдкреГрд╖реНрдарднреВрдорд┐
bg.png рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд┐рддреНрд░ рднреА рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЛрдгреАрдп рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди html рдХреЛ рдПрдХ рдврд╛рдВрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдВ (рдореИрдВрдиреЗ рдЗрд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдкреА рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдХреЛрдгреАрдп рдирд┐рд░реНрджреЗрд╢реЛрдВ рд╕реЗ рдереЛрдбрд╝рд╛ рд╕рд╛рдл рдХрд┐рдпрд╛)ред
рдореВрд▓ HTML рдХреЛрдб <section id="todoapp"> <header id="header"> <h1>todos</h1> <form id="todo-form"> <input id="new-todo" placeholder="What needs to be done?" autofocus> </form> </header> <section id="main"> <input id="toggle-all" type="checkbox"> <label for="toggle-all">Mark all as complete</label> <ul id="todo-list"> <li> <div class="view"> <input class="toggle" type="checkbox"> <label>hello</label> <button class="destroy"> </button> </div> <form > <input class="edit"> </form> </li> </ul> </section> <footer id="footer"> <span id="todo-count"><strong>0</strong> <span>items left</span> </span> <ul id="filters"> <li><a href="/" class="selected">All</a></li> <li><a href="/active">Active</a></li> <li><a href="/completed">Completed</a></li> </ul> <button id="clear-completed">Clear completed (0)</button> </footer> </section>
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ HTML рдореЗрдВ 3 рдореБрдЦреНрдп рдмреНрд▓реЙрдХ рд╣реИрдВ:
- рд╣реИрдбрд░ - рдпрд╣рд╛рдБ рдореБрдЦреНрдп рдЗрдирдкреБрдЯ рд╣реИред рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ;
- рдореБрдЦреНрдп - рдореБрдЦреНрдп рдмреНрд▓реЙрдХ, рдХрд╛рд░реНрдп рд╕реВрдЪреА рдЦреБрдж рд╣реА рдпрд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ;
- рдкрд╛рдж рд▓реЗрдЦ - рд╕реНрдерд┐рддрд┐ рд░реЗрдЦрд╛, рдпрд╣рд╛рдВ рдЬрд╛рдирдХрд╛рд░реА, рдлрд╝рд┐рд▓реНрдЯрд░ рдФрд░ 'рдкреВрд░реНрдг рдкреВрд░реНрдг' рдмрдЯрди рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛
рддреЛ, рдЖрдЗрдП рдХрд╛рд░рдгред рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдПрдХ рд╕реНрдЯрд╛рдЗрд▓рд╢реАрдЯ рд╣реЛрдЧреА, рд╕реНрдЯреИрдЯрд┐рдХ рдбреЗрдЯрд╛ (рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдЗрдореЗрдЬ) рдХреА рд╡рд╛рдкрд╕реА рд╣реЛрдЧреА, рд╡рд╣рд╛рдБ html рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реЛрдВрдЧреЗ, рдХрдо рд╕реЗ рдХрдо 2 рдлрд╛рдЗрд▓реЗрдВ рднреА рд╣реЛрдВрдЧреА - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд░реНрдмреА рдХреЗ рджреЛ рд╣рд┐рд╕реНрд╕реЗ (рд╕рд░реНрд╡рд░ рдкрд╛рд░реНрдЯ, рдФрд░ рдбрд░реНрдмреА рдПрдкреНрд▓реАрдХреЗрд╢рди рдЦреБрдж)ред рдЗрд╕ рд╕рдм рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВрдиреЗ рдРрд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ (рдЖрдк рдХреЛрдИ рдЕрдиреНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ):
public/ bg.png app
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реАрдПрд╕рдПрд╕ рдлрд╝рд╛рдЗрд▓ рдРрдк рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рд╣реИ, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рдирд╣реАрдВред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдбрд░реНрдмреА рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЙрдиреНрд╣реЗрдВ рд╕реАрдзреЗ рд╢реИрд▓реА рдЯреИрдЧ рдореЗрдВ рдкреГрд╖реНрда рдХреЗ рдкреНрд░рдореБрдЦ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ - рдЬреИрд╕рд╛ рдХрд┐ Google рдЕрдиреБрд╕рдВрдзрд╛рди (рдбрд░реНрдмреА рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░) рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдпрд╣ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рдЧрддрд┐ рдореЗрдВ рд░рдЦрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рдкрд╛рда рдореЗрдВ рдХрд╣рд╛ рдерд╛, рдРрдк рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рдм рдХреБрдЫ рдПрдХ
рдЖрдЗрд╕реЛрдореЙрд░реНрдлрд┐рдХ рдбрд░реНрдмреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИред рдореБрдЭреЗ "рдЖрдЗрд╕реЛрдореЙрд░реНрдлрд┐рдХ" рд╢рдмреНрдж рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛, рдореИрдВ рдХреЗрд╡рд▓ "рдбрд░реНрдмреА рдХреЗ рд╕рд░реНрд╡рд░ рднрд╛рдЧ" рдХреЗ рд╡рд┐рдкрд░реАрдд рдбрд░реНрдмреА рдЖрд╡реЗрджрди рдХреЛ рдХрд╣реВрдВрдЧрд╛ред рдпрд╣рд╛рдВ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрди рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде (рдРрдк рдореЗрдВ рд╕рдм рдХреБрдЫ), рдХреНрд▓рд╛рдЗрдВрдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдПрдХ рдмрдВрдбрд▓ (рдЯреБрдХрдбрд╝рд╛) рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рд░рдЦрд╛ред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ (рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП), рдЖрдк рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдХрдИ рдбрд░реНрдмреА рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд╛рдЗрдВрдЯ рднрд╛рдЧ рдФрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ред рдпрд╣ рджреЛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЙрдЪрд┐рдд рд╣реИ, рдЕрдирд╛рд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ (рдЯреЗрдореНрдкреНрд▓реЗрдЯ, рд╕реНрдЯрд╛рдЗрд▓, рдХреЛрдб), рдФрд░ рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдпрд╣реА рд╣реИ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛: рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рд╕рд░реНрд╡рд░ рднрд╛рдЧ рдФрд░ рдХрдИ рдбрд░реНрдмреА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реЛрдВрдЧреЗ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреЛ)ред
Package.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╕рдорд╛рди рджреЛ рдореЙрдбреНрдпреВрд▓ рд╣реЛрдВрдЧреА: derby@0.6.0-alpha5 рдФрд░ derby-starterред
рд╢реБрд░реБрдЖрдд рд╣реЛ рд░рд╣реА рд╣реИ
рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдПрдБред рд╣рдо рдкреГрд╖реНрдарднреВрдорд┐ рдЫрд╡рд┐ рдФрд░ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдореИрдВрдиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕рдВрдХреЗрдд рджрд┐рдП рдереЗ, рд╣рдо
npm init
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреИрдХреЗрдЬ рдмрдирд╛рддреЗ рд╣реИрдВред рдЖрдк рдкрд┐рдЫрд▓реЗ рдкрд╛рда рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдЪрдЯреАрдПрдордПрд▓ рдХреЛ рдереЛрдбрд╝рд╛ рдШреБрдорд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд
Body:
рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
Body:
рджреВрд╕рд░реА рдмрд╛рдд, рд╣рдо рд╣реЗрдбрд░, рдореЗрди рдФрд░ рдлреВрдЯрд░ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбрд░реНрдмреА рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд░рдЦреЗрдВрдЧреЗред
рдЕрдВрддрд┐рдо рд╕реВрдЪрдХрд╛рдВрдХред Html <Body:> <section id="todoapp"> <view name="header"/> <view name="main"/> <view name="footer"/> </section> <header:> <header id="header"> <h1>todos</h1> <form id="todo-form"> <input id="new-todo" placeholder="What needs to be done?" autofocus> </form> </header> <main:> <section id="main"> <input id="toggle-all" type="checkbox"> <label for="toggle-all">Mark all as complete</label> <ul id="todo-list"> <li> <div class="view"> <input class="toggle" type="checkbox"> <label>hello</label> <button class="destroy"> </button> </div> <form > <input class="edit"> </form> </li> </ul> </section> <footer:> <footer id="footer"> <span id="todo-count"><strong>0</strong> <span>items left</span> </span> <ul id="filters"> <li><a href="/" class="selected">All</a></li> <li><a href="/active">Active</a></li> <li><a href="/completed">Completed</a></li> </ul> <button id="clear-completed">Clear completed (0)</button> </footer>
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛
view
рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдирд╛рдо рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдирд╛рдо рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрдиреЗ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдХрд╛рд░реНрдп рдХреЛрдб рдмрдирд╛рдПрдВрдЧреЗред
рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ server.js рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдФрд░ рд╕реНрдерд┐рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
server.js var server = require('derby-starter'); var appPath = __dirname + '/app'; var options = { static: __dirname + '/public' }; server.run(appPath, options);
рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╢реИрдХреНрд╖рд┐рдХ рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг, рд╣рдо рд╕рд░реНрд╡рд░ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд░реНрдмреА-рд╕реНрдЯрд╛рд░реНрдЯрд░ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЕрдВрджрд░ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдерд┐рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╡рд╛рдкрд╕реА рдПрдХреНрд╕рдкреНрд░реЗрд╕-рд╕реНрдЯреЗрдЯрд┐рдХ рд╕реНрдЯреЗрдЯрд┐рдХ-рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдЙрдкрдпреЛрдЧ рд╣реИред
рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВред
рдиреНрдпреВрдирддрдо рд╕реВрдЪрдХрд╛рдВрдХ редjs: var derby = require('derby'); var app = module.exports = derby.createApp('todos', __filename);
рд╕рдм рдХреБрдЫ, рд╣рдо npm рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ (рдпрд╛ рд╕реАрдзреЗ рдиреЛрдб server.js), рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ
http: // localhost: 3000 / рдкрд░рд┐рдгрд╛рдо:

рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рд╢реИрд▓рд┐рдпрд╛рдБ рдкрдХрдбрд╝реА рдЧрдИрдВред рдПрдХ рд╢реБрд░реБрдЖрдд рдХреА рдЧрдИ рд╣реИред
рдбрд┐рдЬрд╛рдЗрди рдпреВрдЖрд░рдПрд▓
рдкрд┐рдЫрд▓реЗ рдкрд╛рда рдореЗрдВ, рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдПрдХ рдбрд░реНрдмреА рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЙрд░рд▓реЛрдВ рдореЗрдВ рддреЛрдбрд╝рдХрд░ рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рджреЛрдиреЛрдВ рдкреГрд╖реНрдареЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдбрд░реНрдмреА рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реИ, рдЬреЛ рдЦреЛрдЬ рдЗрдВрдЬрди рдХреЛ рдкрд╕рдВрдж рд╣реИред рддреЛ, рдХреЛрдгреАрдп рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╕рдордп, рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдкрд╛рдж рд▓реЗрдЦ рдореЗрдВ 3 рд▓рд┐рдВрдХ рд╣реИрдВ рдЬреЛ рдпреВрдЖрд░рдПрд▓ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ред рдпрд╣рд╛рдВ рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ 3 рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рд╣реИрдВрдбрд▓рд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
app.get('/', getAllTodos); app.get('/active', getActiveTodos); app.get('/completed', getCompletedTodos);
рдпрд╣ рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛ рдпрджрд┐ рдпреЗ рд╕рднреА рдкреГрд╖реНрда рдЕрд▓рдЧ-рдЕрд▓рдЧ рдереЗ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рдЙрдирдХреЗ рдмреАрдЪ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЛрдб рдХреЛ рдиреНрдпреВрдирддрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред
рдбрд┐рдЬрд╛рдЗрди рдбреЗрдЯрд╛
рдХрд╛рд░реНрдп рд╕реНрд╡рдпрдВ
todos
рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреЛ рджреЛ рдХреНрд╖реЗрддреНрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:
- рдкрд╛рда - рдХрд╛рд░реНрдп рд╡рд┐рд╡рд░рдг
- рдкреВрд░реНрдг - рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ
рдЗрд╕рдореЗрдВ рд╣рдореЗрдВ рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдореЗрдВ, рдПрдХ рдЖрдИрдбреА рдлрд╝реАрд▓реНрдб рднреА рд╣реЛрдЧреА - рдбрд░реНрдмреА рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдПрдХ рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, рдбрд░реНрдмреА рдкрджреНрдзрддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ (рдлрд╝рдВрдХреНрд╢рди рдЬреЛ url рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ), рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдпреЛрдЬрдирд╛рдмрджреНрдз рд░реВрдк рд╕реЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
function getTodos(page, model){ model.subscribe('todos', function(){ page.render(); }); }
рдпрд╣ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ (рд╕рднреА рддреАрди рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдЖрдкрдХреЛ рдбрд░реНрдмреА рдореЙрдбрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╕реАрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- "рдкрде" рдПрдХ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "_session", "_page", рдЖрджрд┐)
- "_page" рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреНрдпрд╛ рд╣реИ
- рдбрд░реНрдмреА рдлрд┐рд▓реНрдЯрд░ рдХреНрдпрд╛ рд╣реИ
- рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд░реЗрдлрд░реА рдХреНрдпрд╛ рд╣реИ
рдЖрдЦрд┐рд░реА рдкрд╛рда рдореЗрдВ, рдореИрдВрдиреЗ рддрдерд╛рдХрдерд┐рдд "рдкрдереЛрдВ" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреАред рд╣рдо рдЙрдиреНрд╣реЗрдВ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╕рдордп: model.subscribe ('path'), рдореЙрдбрд▓ рдХреЛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдФрд░ рд▓рд┐рдЦрддреЗ рд╕рдордп:
model.get('')
,
model.set('', )
ред рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг:
- 'todos' - рдкреВрд░реЗ todos рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рд▓рд┐рдВрдХ
- 'users.42' - рдЖрдИрдбреА = 42 рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рджреЗрдЦреЗрдВ
рддреЛ рдпрд╣рд╛рдБ рд╣реИред рдкрде рдХрд╛ рдкрд╣рд▓рд╛ рдЦрдВрдб рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ, рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдирд╛рдоред рдпрд╣ рдбрд░реНрдмреА рдирд╛рдо рдпрд╛ рддреЛ рдПрдХ рд▓реИрдЯрд┐рди рдкрддреНрд░ рдХреЗ рд╕рд╛рде, рдпрд╛ рдЕрдХреНрд╖рд░ $ рдпрд╛ _ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред $ рдФрд░ _ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд╕рдВрдЧреНрд░рд╣ рд╡рд┐рд╢реЗрд╖ рд╣реИрдВ, рд╡реЗ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдирд╣реАрдВ рд╣реИрдВ (рд╡реЗ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рд╣реИрдВ, рдФрд░ рдбрд░реНрдмреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП $ рдЖрд░рдХреНрд╖рд┐рдд рдбрд░реНрдмреА рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдЧреНрд░рд╣ред рдПрдХ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдЧреНрд░рд╣ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдереЛрдбрд╝рд╛ рдкреНрд░рдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдХрдВрд╕реЛрд▓ рдЦреЛрд▓реЗрдВ рдФрд░
app.model.get()
рдЯрд╛рдЗрдк
app.model.get()
- рдЖрдЙрдЯрдкреБрдЯ рджреЗрдЦреЗрдВред
"_" - рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдПрдХ рд╣реИ -
_page
, рдпрд╣ рд╣рд░ рдмрд╛рд░
_page
рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдпреВрдЖрд░рдПрд▓
_page
- рдпрд╣ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рдордХрд╛рдЬреА рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕ рдкрд╛рда рдореЗрдВ рдЖрдкрдХреЛ рдФрд░ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред
рдЪрд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдбрд░реНрдмреА рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рддрдВрддреНрд░ рд╣реИрдВред рдпрд╣, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдлрд╝рдВрдХреНрд╢рдВрд╕, рдбреЗрдЯрд╛, рдбреЗрдЯрд╛ рдлрд╝рд┐рд▓реНрдЯрд░, рдбреЗрдЯрд╛ рд╕реЙрд░реНрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╡рд┐рднрд┐рдиреНрди рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ред
рдлрд┐рд▓реНрдЯрд░ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рд╕рдХреНрд░рд┐рдп рдХрд╛рд░реНрдп рджрд┐рдЦрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝рд┐рд▓реНрдЯрд░:
рд╣рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╛рдо рд╕реЗ рдПрдХ рдлрд┐рд▓реНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ (рдмрдВрдбрд▓ рдореЗрдВ рдХреНрд░рдорд╛рдВрдХрди рдХреЗ рд▓рд┐рдП рдирд╛рдо рдЖрд╡рд╢реНрдпрдХ рд╣реИ)ред рдкреНрд░рд▓реЗрдЦрди рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ
app.on('model')
рдореЗрдВ рд╕рдЦреНрддреА рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
app.on('model', function(model) { model.fn('completed', function(item) { return item.completed; }); });
рдФрд░ рдЖрдЧреЗ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ, рд╣рдо рдЗрд╕ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ todos рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ:
function getPage(page, model){ model.subscribe('todos', function() { var filter = model.filter('todos', 'completed') filter.ref('_page.todos'); page.render(); }); }
рдпрд╣рд╛рдВ рд▓рд╛рдЗрди
filter.ref('_page.todos');
рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ
filter.ref('_page.todos');
, рдЗрд╕рдореЗрдВ, рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ "todos"
_page.todos
рдкрде рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдХрд░, рдореИрдВ рдпрд╣рд╛рдБ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛрдб рд╣реИ:
app.on('model', function(model) { model.fn('all', function(item) { return true; }); model.fn('completed', function(item) { return item.completed;}); model.fn('active', function(item) { return !item.completed;}); }); app.get('/', getPage('all')); app.get('/active', getPage('active')); app.get('/completed', getPage('completed')); function getPage(filter){ return function(page, model){ model.subscribe('todos', function() { model.filter('todos', filter).ref('_page.todos'); page.render(); }); } }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рд╢рд╛рдпрдж рджреЗрдЦрд╛ рдерд╛, рд╣рд░ рдЪреАрдЬ рдХреЛ рдПрдХрдЬреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдПрдХ рдЭреВрдард╛ рдлрд┐рд▓реНрдЯрд░ "рдСрд▓" рдХрд░рдирд╛ рдкрдбрд╝рд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдИ рдХрдореА рдирд╣реАрдВ рд╣реИред
рдареАрдХ рд╣реИ, рд╣рдо рдереЛрдбрд╝рд╛ рд╡рд┐рдЪрд▓рд┐рдд рд╣реБрдПред рдЖрдЗрдП рдЖрд╡реЗрджрди рдХреЛ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд░реЗрдВред
рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛
рд╣рдорд╛рд░реЗ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдбреЗрдЯрд╛ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
<form id="todo-form"> <input id="new-todo" placeholder="What needs to be done?" autofocus> </form>
рдбрд░реНрдмреА рдореЗрдВ рдХреНрд▓рд╛рд╕рд┐рдХ рдкреИрдЯрд░реНрди (рдХрдИ рдЖрдзреБрдирд┐рдХ рдЪреМрдЦрдЯреЗ рдореЗрдВ) рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдВрдзрди рд╣реИред
_page
рдореЗрдВ рдХреБрдЫ рдкрде рдХреЗ рд╕рд╛рде рдЗрдирдкреБрдЯ рдореЗрдВ рджрд░реНрдЬ рдореВрд▓реНрдп рдХреЛ
_page
ред
enter
рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдлреЙрд░реНрдо рдХреЗ
submit
рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рднреА рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВрдЧреЗ:
<form id="todo-form" on-submit="addTodo(_page.newTodo)"> <input id="new-todo" placeholder="What needs to be done?" autofocus value="{{_page.newTodo}}"> </form>
on-submit
рдмрдЬрд╛рдп
on-submit
рд╣рдо рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ
on-click
,
on-keyup
,
on-focus
рд▓рд┐рдЦ
on-click
- рдЕрд░реНрдерд╛рдд, рдпрд╣ рдбрд░реНрдмреА рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдорд╛рдирдХ рддрд░реАрдХрд╛ рд╣реИред рд╣рдо рд╣реИрдВрдбрд▓рд░ рдХреЛ
app.proto
рдореЗрдВ
app.proto
(рдЬрдм рд╣рдо рдбрд░реНрдмреА рдШрдЯрдХреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЦреБрдж рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ):
app.proto.addTodo = function(newTodo){ if (!newTodo) return; this.model.add('todos', { text: newTodo, completed: false }); this.model.set('_page.newTodo', ''); };
рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдкрд╛рда рдЦрд╛рд▓реА рд╣реИ, рдХрд╛рд░реНрдп рдХреЛ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ,
input
рд╕рд╛рдл рдХрд░реЗрдВред рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╣рдореЗрдВ рдЗрд╡реЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╛ рд╕реНрд╡рдпрдВ html рддрддреНрд╡ рдХреЗ рд╕рдВрджрд░реНрдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ html рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:
on-submit="addTodo(_page.newTodo, $event, $element)"
,
$event
рдФрд░
$element
рд╡рд┐рд╢реЗрд╖ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рдЬреЛ рдбрд░реНрдмреА рджреНрд╡рд╛рд░рд╛ рд╣реА рднрд░реЗ рдЧрдП рд╣реИрдВред
рдЕрдм рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рд╕реВрдЪреА рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ - рд╣рдорд╛рд░реЗ
ul
рддрддреНрд╡ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
<ul id="todo-list"> {{each _page.todos as #todo, #index}} <li class="{{if #todo.completed}}completed{{/}}"> <div class="view"> <input class="toggle" type="checkbox" checked="{{#todo.completed}}"> <label>{{#todo.text}}</label> <button class="destroy"> </button> </div> <form> <input class="edit"> </form> </li> {{/each}} </ul>
рддреЛ рдХреНрдпрд╛ рдХрд┐рдпрд╛:
- рд╣рдо рд╕рднреА todos (рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдлрд╝рд┐рд▓реНрдЯрд░) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк рдХрд░рддреЗ рд╣реИрдВ - рдЙрдирдХреЗ рд▓рд┐рдП рддрддреНрд╡ рдмрдирд╛рддреЗ рд╣реИрдВ-
li
- рдХрд╛рд░реНрдп рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ
lable
рдореЗрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ todo.completed
рдХреЛ checkbox
рдмрд╛рдВрдз todo.completed
- рдпрджрд┐ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ
li
рдЯреИрдЧ рдХреЗ рд▓рд┐рдП completed
рд╡рд░реНрдЧ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред
рдЖрдЗрдЯрдо рд╣рдЯрд╛рдПрдВ
рдпрд╣ рдкреНрд░рд╛рдердорд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
<button class="destroy" on-click="delTodo(#todo.id)"> </button>
app.proto.delTodo = function(todoId){ this.model.del('todos.' + todoId); };
рдФрд░ рдпрд╣ рднреА рдХрдо рд╕рдВрднрд╡ рдерд╛:
<button class="destroy" on-click="model.del('todos.' + #todo.id)"> </button>
рд╕рднреА "рдкреВрд░реНрдг" рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╕рдорд╛рди рд╣реИ ("рдкреВрд░рд╛ рд╣реБрдЖ" рдмрдЯрди рдиреАрдЪреЗ рджрд╛рдИрдВ рдУрд░ рд╕реЗ рд╣реИ):
<button id="clear-completed" on-click="clearCompleted()"> Clear completed (0) </button>
app.proto.clearCompleted = function(){ var todos = this.model.get('todos'); for (var id in todos) { if (todos[id].completed) this.model.del('todos.'+id); } }
рддрддреНрд╡реЛрдВ рдХрд╛ рд╕рдВрдкрд╛рджрди
рдбрдмрд▓-рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рдХрд╛рд░реНрдп рдХреЛ рд╕рдВрдкрд╛рджрди рдореЛрдб рдореЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдЖрдЙрдЯ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЬрдм рдЗрд╕ рдореЛрдб рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ
editing
рд╡рд░реНрдЧ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд
li
рддрддреНрд╡ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА, рдЖрдкрдХреЛ рдЙрд╕ рдЪрдпрди рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдбрдмрд▓-рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдЗрдирдкреБрдЯ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдореИрдВ рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ: рд╣рдо рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ -
_page.edit ред рд╡рд╣рд╛рдВ рд╣рдо рдПрдбрд┐рдЯ рдХрд┐рдП рдЧрдП рдЯрд╛рд╕реНрдХ рдХреА рдЖрдИрдбреА рдФрд░ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВрдЧреЗред
рдкрд╛рда рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдХреНрдпреЛрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рд░реНрдп рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ?рдпрд╣ рд╕рдм рд▓рдХреНрд╖реНрдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдХрд╛рд░реНрдп рдХреЛ рдЗрдирдкреБрдЯ рд╕реЗ рд╕реАрдзреЗ рдкрд╛рда рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрддреНрд╡ рдХреЛ рд╕реАрдзреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред рдпрд╣реА рд╣реИ, рдЗрд╕рдХреЗ рд╕рдВрдкрд╛рджрди (рдПрдХ рдмрдЯрди рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЗрд╕) рддреБрд░рдиреНрдд рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╛рда рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рджреГрд╢реНрдп рдЕрдВрдд рдореЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИ, рдпрд╛ рдкреНрд░рддрд┐рдмрджреНрдз рд╣реЛрдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ ... рдпрд╣реА рд╣реИ, рд╕рдм рдХреБрдЫ рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ enter
ред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдпрд╣ рд╕рдм рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
<ul id="todo-list"> {{each _page.todos as #todo}} <li class="{{if #todo.completed}}completed{{/}} {{if _page.edit.id === #todo.id}}editing{{/}}"> <div class="view"> <input class="toggle" type="checkbox" checked="{{#todo.completed}}"> <label on-dblclick="editTodo(#todo)">{{#todo.text}}</label> <button class="destroy" on-click="delTodo(#todo.id)"> </button> </div> <form on-submit="doneEditing(_page.edit)"> <input id="{{#todo.id}}" class="edit" value="{{_page.edit.text}}" on-keyup="cancelEditing($event)"> </form> </li> {{/each}} </ul>
app.proto.editTodo = function(todo){ this.model.set('_page.edit', { id: todo.id, text: todo.text }); window.getSelection().removeAllRanges(); document.getElementById(todo.id).focus() } app.proto.doneEditing = function(todo){ this.model.set('todos.'+todo.id+'.text', todo.text); this.model.set('_page.edit', { id: undefined, text: '' }); } app.proto.cancelEditing = function(e){
рдПрдХ рдбрдмрд▓ рдХреНрд▓рд┐рдХ рдХреЗ рд╕рд╛рде,
EditTodo рдлрд╝рдВрдХреНрд╢рди рдХреЛ
рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛
рд╣реИ , рдЗрд╕рдореЗрдВ рд╣рдо
_path.edit рдХреЛ
рднрд░рддреЗ рд╣реИрдВ , рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЪрдпрди рдХреЛ
рд╣рдЯрд╛рддреЗ рд╣реИрдВ , рд╣рдореЗрдВ рдЬрд┐рд╕ рдЗрдирдкреБрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЙрд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рдзреЛрдЦрд╛ рджрд┐рдпрд╛, рдЗрдирдкреБрдЯ
id = todo.id
)ред
рд╕рдВрдкрд╛рджрди рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╛ рддреЛ рджрд░реНрдЬ рдХрд░реЗрдВ рдпрд╛ esq рджрдмрд╛рдПрдБред рддрджрдиреБрд╕рд╛рд░, рджреЛ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ
doneEditing
: рдХрд┐рдпрд╛
doneEditing
,
cancelEditing
doneEditing
,
cancelEditing
ред рдХреЛрдб рдЬрд╛рдиреЗрдВ - рдХреЛрдИ рдирдИ рдмрд╛рдд рдирд╣реАрдВред
рд╕рдХреНрд░рд┐рдп рдФрд░ рдкреВрд░реНрдг рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ - рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдХрд╛рд░реНрдп
рдЗрд╕рд▓рд┐рдП, рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдЬреЛ рд╣рдо рдХрд░реЗрдВрдЧреЗ, рд╡рд╣ рдкрд╛рдж рд▓реЗрдЦ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рдФрд░ рдкреВрд░реНрдг рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдХрд╛рд░реНрдп рдХреНрдпрд╛ рд╣реИрдВред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рд╕реА рдЯрд┐рдкреНрдкрдгреАрдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдирд╛ рдЧрдпрд╛ рдЖрд╡реЗрджрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рдЯрд╛рдВрдХрд╛ рд▓рдЧрд╛рдиреЗ рд╕реЗ, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛ рддреБрд░рдВрдд рд▓рд╛рдЗрд╡-рдХреНрд╡реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреА рд╣реИ - рдпрд╣ рдПрдХ рдФрд░ рднрдпрд╛рдирдХ рдбрд░реНрдмреА рддрдВрддреНрд░ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдореИрдВрдЧреЛ-рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдЪрдпрди, рд╕реЙрд░реНрдЯрд┐рдВрдЧ, рдорд╛рддреНрд░рд╛ рд╕реАрдорд╛ ( $limit
, $skip
, $orderby
) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдкреНрд░рд╢реНрди рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ (рдХрд┐рд╕реА рднреА рдЪрдпрди рдХреЗ рд╕рд╛рде) - рдпрд╣ рд╕рд┐рд░реНрдл рд╣рдорд╛рд░рд╛ рдорд╛рдорд▓рд╛ рд╣реИред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ "рд▓рд╛рдЗрд╡" рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВрдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджрд┐рдЦрд╛рдирд╛ рдЙрдЪрд┐рдд рд╕рдордЭрд╛, рдЬреЛ рдЕрдХреНрд╕рд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рддреЛ, рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд╣рд░ рдмрд╛рд░ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХреБрдЫ рдбреЗрдЯрд╛ рдмрджрд▓рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рд╣рдореЗрдВ рд╕рдВрдХреЗрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдлрд╝рдВрдХреНрд╢рди рдЗрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдЧрд╛ред рдпрд╣ рдбреЗрдЯрд╛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрддрд╛ рд╣реИред рдлрд┐рд░ рд╡рд╣ рдХреБрдЫ рдЧрдгрдирд╛ рдХрд░рддреА рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддреА рд╣реИред рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ "рдкрде" рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ ...
рдареАрдХ рд╣реИ, рдпрд╣ рд╕рдм рд╕рд╛рд░ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдХреНрд░рд┐рдп рдФрд░ рдкреВрд░реНрдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЯреЙрдбреЛрд╕ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐, рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдкрд░, рд╣рдо, рдХрд╣реАрдВ рди рдХрд╣реАрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
_page.counters
path рдХреЗ рд╕рд╛рде), рд╕рдХреНрд░рд┐рдп рдФрд░ рдкреВрд░реНрдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХрд╛рдЙрдВрдЯрд░реЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
_page.counters = { active: 2, completed: 3 }
рддрдм рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╛рдж рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рдереЗред
рдЗрди рдХрд╛рдЙрдВрдЯрд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рд╡реЗ рдлрд┐рд▓реНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕реА рддрд░рд╣ рдкрдВрдЬреАрдХреГрдд рд╣реИрдВ:
app.on('model', function(model) { model.fn('all', function(item) { return true; }); model.fn('completed', function(item) { return item.completed;}); model.fn('active', function(item) { return !item.completed;}); model.fn('counters', function(todos){ var counters = { active: 0, completed: 0 }; for (var id in todos) { if(todos[id].completed) counters.completed++; else counters.active++; } return counters; }) });
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рдордиреЗ
counters
рдХрд╛рд░реНрдп рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рдЕрднреА рднреА рд╕рд╣реА рд╕рдордп рдкрд░ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдФрд░ рд░рд╛рд╕реНрддреЛрдВ рд╕реЗ рдмрдВрдзреЗ рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ
model.start
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛
model.start
рд╣реИ:
model.subscribe('todos', function () { model.filter('todos', filter).ref('_page.todos'); model.start('_page.counters', 'todos', 'counters'); page.render(); });
рдпрд╣ рдЕрдм, рдХрд╛рдЙрдВрдЯрд░ рд╣рдорд╛рд░реЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рд╣рдо рдлреВрдЯрд░ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗ рд░рд╣реЗ рд╣реИрдВ:
<footer:> <footer id="footer"> <span id="todo-count"><strong>{{_page.counters.active}} </strong> <span>items left</span> </span> <ul id="filters"> <li><a href="/" class="{{if $render.url==='/' }}selected{{/}}">All</a></li> <li><a href="/active" class="{{if $render.url==='/active' }}selected{{/}}">Active</a></li> <li><a href="/completed" class="{{if $render.url==='/completed'}}selected{{/}}">Completed</a></li> </ul> <button id="clear-completed" on-click="clearCompleted()" class="{{if _page.counters.completed==0}}hidden{{/}}"> Clear completed ({{_page.counters.completed}}) </button> </footer>
рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдкреВрд░реНрдг рди рд╣реЛрдВ, рддреЛ рд╣рдордиреЗ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рдЙрдВрдЯрд░ рджрд┐рдЦрд╛рдП, рд╕рд╛рде рд╣реА "рдХреНрд▓рд┐рдпрд░ рдХрдореНрдкреНрд▓реАрдЯ" рдмрдЯрди рдХреЛ рдЫрд┐рдкрд╛рдПред рд╣рдордиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕рд╛рдВрддреНрд╡рдирд╛ рдореЗрдВ
app.model.get()
рдХреЗ рдЕрдзреНрдпрдпрди рдХреЗ рджреМрд░рд╛рди рдкреНрд░рд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП,
selected
рд╡рд░реНрдЧ рдХреЛ рдЙрд╕ рд▓рд┐рдВрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рд╣реИ рдЬреЛ рд╕рдХреНрд░рд┐рдп рд╣реИред рд╣рд╛рдВ, рдЖрд░рдХреНрд╖рд┐рдд
$render
рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
url
рдЧрдпрд╛
url
ред рдХрдВрд╕реЛрд▓ рдкрд░ рдлрд┐рд░ рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред
рдкрд░рд┐рдгрд╛рдо
рдЪрд▓реЛ рдЬреЛ рд╣реБрдЖ рдЙрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реИрдВ, рдХрдИ рдЯреИрдм рдЦреЛрд▓реЗрдВ, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рд╣реИ:

рдпрджрд┐ рдЖрдк рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдПрдХ
рдЧрд┐рдЯрдм рдкреНрд░реЛрдЬреЗрдХреНрдЯ,
рдкреБрдирд╢реНрдЪрдпрджрд┐ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбрд░реНрдмреАрдЬ рд▓реЗрдЦреЛрдВ рдХреЛ рдпрд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░реА рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкрд░ рдЕрдкрдбреЗрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ:
zag2art ред рдореИрдВ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ - рд╣рдм рдкрд░, рдЯреНрд░реИрдХрд░ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ (рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк) рд╣рдм рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдХреБрдЫ рднреА рдпрд╛рдж рди рдХрд░реЗрдВред
рдпрджрд┐ рдЖрдк рдбрд░реНрдмреАрдЬ рдХреЛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ - рддреЛ рдЬреАрдердм рдкрд░ рддрд╛рд░рд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реЗрд╢рд╛рдиреА рди рд▓реЗрдВ