Mithril.js рдкрд░ рдирдореВрдирд╛ рд╕рд░рд▓ рдиреЛрдЯреНрд╕ рдПрд╕рдкреАрдП

Mithril.js рдХреНрд▓рд╛рдЗрдВрдЯ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓реЛрдХрдкреНрд░рд┐рдп рдЙрдкрдХрд░рдг рд╣реИред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ Habr├й рдкрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреЛрдИ рдкреНрд░рдХрд╛рд╢рди рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдорд┐рдереНрд░рд┐рд▓ рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЖрд╡реЗрджрди рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрд╡реЗрджрди рдЗрд╕ рдкреНрд░рдХрд╛рд╢рди ( рдЕрдиреБрд╡рд╛рдж ) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдЧрд╛

рдорд┐рд╣рд┐рд░рд┐рд▓ рдХреНрдпрд╛ рд╣реИ


рдорд┐рдереНрд░рд╛рдЗрд▓ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдврд╛рдВрдЪрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдПрд╕рдкреАрдП (рд╕рд┐рдВрдЧрд▓-рдкреЗрдЬ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди) рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рдм рдХреЗ рд╕рдм, рдпрд╣ рд╕рд┐рд░реНрдл рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдПрдкреАрдЖрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ 13 рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдорд┐рдерд┐рд▓рд╛-рдзрд╛рд░рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬрд┐рд╕реЗ рдорд┐рдереНрд░рд┐рд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрд▓рдЧ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдорд┐рдереНрд░рд┐рд▓ рдХреЗ рдореВрд▓ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд░реВрдЯ рдХрд░рдирд╛ рдФрд░ XHR рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдХреЗрдВрджреНрд░реАрдп рдЕрд╡рдзрд╛рд░рдгрд╛ рдЕрдореВрд░реНрдд рд╣реИ - рдПрдХ рдЖрднрд╛рд╕реА рдиреЛрдб (vnode)ред рд╡рд░реНрдЪреБрдЕрд▓ рдиреЛрдб рдХреЗрд╡рд▓ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ js рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред рд╡рд░реНрдЪреБрдЕрд▓ рдиреЛрдбреНрд╕ рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди m () рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдиреЛрдб рд╕реВрдЪреА (рд╡рд░реНрдЪреБрдЕрд▓ рдбреЛрдо) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреГрд╖реНрда рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдореЗрдВ, рд╡рд░реНрдЪреБрдЕрд▓ DOM рдХрд╛ DOM рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм DOM API рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдкреНрд░рд╛рд░рдВрдн рд╣реЛрддрд╛ рд╣реИ, рдЬрдм m.request () рд╡рд╛рджрд╛ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬрдм URL рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ (рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдиреЗрд╡рд┐рдЧреЗрд╢рди), рдПрдХ рдирдпрд╛ рд╡рд░реНрдЪреБрдЕрд▓ DOM рдПрд░реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ,рдкреБрд░рд╛рдиреЗ, рдФрд░ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдиреЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдиреЗ рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ DOM рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред DOM рдЗрд╡реЗрдВрдЯ рдФрд░ m.request () рдЕрдиреБрд░реЛрдз рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, redrawing рдХреЛ m.redraw () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдмреЙрдХреНрд╕ рдХреЗ рдмрд╛рд╣рд░ рдорд┐рдерд╛рдЗрд▓ рдореЗрдВ рдХреЛрдИ HTML рдЬреИрд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдирд╣реАрдВ рд╣реИрдВ, рдХреЛрдИ JSX рд╕рдкреЛрд░реНрдЯ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЗрди рд╕рднреА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдпрд╣рд╛рдВ рдЗрди рдЕрд╡рд╕рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред

рдпрджрд┐ рдкрд╣рд▓рд╛ рддрд░реНрдХ m () рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 'div'), рддреЛ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЪреБрдЕрд▓ рдиреЛрдб рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, DOM рдореЗрдВ HTML рдЯреИрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

<div></div>

рдпрджрд┐ рдкрд╣рд▓рд╛ рддрд░реНрдХ m () рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдРрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рджреГрд╢реНрдп () рд╡рд┐рдзрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдШрдЯрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдШрдЯрдХ рдХрд╛ рджреГрд╢реНрдп () рд╡рд┐рдзрд┐, рдмрджрд▓реЗ рдореЗрдВ, рд╣рдореЗрд╢рд╛ m () рдлрд╝рдВрдХреНрд╢рди (рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╕рд░рдгреА: [m (),]) рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдШрдЯрдХ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЕрдВрддрддрдГ рд╕рднреА рдШрдЯрдХ рд╕рд░рд▓ vnode рдиреЛрдбреНрд╕ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред

рдЖрднрд╛рд╕реА рдиреЛрдбреНрд╕ рдФрд░ рдШрдЯрдХреЛрдВ рджреЛрдиреЛрдВ рдореЗрдВ рдЬреАрд╡рди-рдЪрдХреНрд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╣реА oninit (), oncreate (), onbeforeupdate (), рдЖрджрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрди рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдкреНрд░рддрд┐рдкрд╛рджрди рдореЗрдВ рд╕рдордп рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд┐рдВрджреБ рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдк рд╡рд░реНрдЪреБрдЕрд▓ рдиреЛрдб рдпрд╛ рдШрдЯрдХ рдХреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдо () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рддрд░реНрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк vnode.attrs рдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдиреЛрдб рдХреЗ рдЕрдВрджрд░ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред M () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рддреАрд╕рд░рд╛ рддрд░реНрдХ рдЗрд╕ рдиреЛрдб рдХреЗ рд╡рдВрд╢рдЬ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ vnode.children рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред M () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд░рд▓ рдиреЛрдбреНрд╕ m.trust () рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред

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

рдорд┐рдереНрд░рд┐рд▓ рдХреА рдпреЗ рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧрддреА рд╣реИрдВ, рдФрд░ рдлреНрд░реЗрдо рдЕрдзреВрд░рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рдХреЛрдИ рд░рд╛рдЬреНрдп / рднрдВрдбрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рдХреЛрдИ рд░рд┐рдбреНрдпреВрд╕рд░ / рдИрд╡реЗрдВрдЯ рдбрд┐рд╕реНрдкреИрдЪрд░ рдирд╣реАрдВ рд╣реИ, рдХреЛрдИ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдирд╣реАрдВ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЬреИрд╕рд╛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡реИрд╕рд╛ рдХрд░реЗрдВред

рдЖрдкрдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП


рд╣рдо рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВрдЧреЗ:


рдлреНрд░рдВрдЯрдПрдВрдб рд╕рд░реНрд╡рд░ рдпрд╣рд╛рдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рдмрд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдЗрдВрдбреЗрдХреНрд╕.рдмреБрдХ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╕реНрдЯрд╛рдЗрд▓ рдлрд╛рдЗрд▓реЗрдВ рджреЗрдирд╛ рд╣реИред

рд╣рдо рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ рдореЗрдВ рдорд┐рдереНрд░рд┐рд▓ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдПрдХ рдлрд╛рдЗрд▓ рдореЗрдВ рдПрдкреНрд▓реАрдХреЗрд╢рди рдХреЛрдб рдФрд░ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рдмрд╛рдВрдзреЗрдВрдЧреЗред рдЖрд╡реЗрджрди рдХреЛрдб рдФрд░ рдореИрдерд┐рд▓ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдкреЗрдЬ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВ рдЯреВрд▓ рдХреЗ рд▓рд┐рдП рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ, рдмрд╕ рдмрд╛рдЗрдирд░реА рдлрд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбрд╛рд▓реЗрдВ, рдЗрд╕ рддрд░рд╣ рдПрдХ рдЯреЗрд╕реНрдЯ.рдХреЙрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓ рдмрдирд╛рдПрдВ:

db-uri = "postgres://postgres:user1@localhost:5432/testbase"
server-port= 5000
# The name of which database schema to expose to REST clients
db-schema= "public"
# The database role to use when no client authentication is provided.
# Can (and probably should) differ from user in db-uri
db-anon-role = "postgres" 

рдЙрд╕реА рд╕рдордп, рдЖрдкрдХреЗ рдкреЛрд╕реНрдЯрдЧреЗрд╕рд▓ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдПрдХ рдЯреЗрд╕реНрдЯрдмреЗрд╕ рдмреЗрд╕ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ 1 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдЖрдзрд╛рд░ рдореЗрдВ, рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВ:

-- Postgrest sql notes table 
create table if not exists notes (
id serial primary key,
title varchar(127) NOT NULL,
content text NOT NULL,
created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
completed timestamp with time zone,
ddel smallint default 0
)

рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕реНрдЯ рд╕рд░реНрд╡рд░ рдХреЛ рдХрдорд╛рдВрдб рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИ:

postgrest test.conf

рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрдирд╛рддреНрдордХ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдХрд┐рд╕ рдкреЛрд░реНрдЯ рдкрд░ рд╕реБрдиреЗрдЧрд╛ред

рдХрд┐рд╕реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдирд╛


рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдпрд╣ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдорд╛рдЗрдЯреНрд░рд┐рд▓ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрд╡реЗрджрди рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред рдпрд╣рд╛рдБ рдпреЛрдЬрдирд╛ рд╣реИ:

  1. рд╣рдо рдПрдХ рд╕реНрдерд╛рдиреАрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ, рдЖрдЗрдП рдЗрд╕рдХреЗ рдореЙрдбрд▓ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ
  2. рдПрдкреАрдЖрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
  3. рд╣рдо рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдорд╛рд░реНрдЧ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ
  4. рдкрде рдлрд╝рд╛рдЗрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реЛрдЧрд╛ред
  5. рдкреНрд░рддреНрдпреЗрдХ рдЕрд▓рдЧ рдШрдЯрдХ (рдФрд░ рдореИрдВ рдШрдЯрдХ рдкреНрд░рддрд┐рдкрд╛рджрди рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛) рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
  6. рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдЬреЛ рдореЙрдбрд▓ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЙрд╕рдХреЗ рдкрд╛рд╕ рдореЙрдбрд▓ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдЧреАред
  7. рдШрдЯрдХ DOM рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдШрдЯрдХ рдореЗрдВ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд╣реЛрддреЗ рд╣реИрдВ

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ рдХрд╕реНрдЯрдо рдИрд╡реЗрдВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдореВрд▓ рдбреЛрдо рдИрд╡реЗрдВрдЯ, рдЗрди рдЗрд╡реЗрдВрдЯреНрд╕ рдХреЗ рдХреЙрд▓рдмреИрдХ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд╣реИрдВред рдореИрдВ рджреЛ рддрд░рд╣ рд╕реЗ рдмрдВрдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рд╢рд╛рдпрдж рд╣рд░ рдХреЛрдИ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд░ рдХреЛрдИ redux рдпрд╛ vuex рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рддрд░рд╣ рд╕реЗ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рддрдХрдиреАрдХ рднреА рдорд┐рдЯреНрд░рд┐рд▓-рд╕реЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд┐рдЯреНрд░рд┐рд▓ рдореЗрдВ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдврдВрдЧ рд╕реЗ рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рдирд┐рд░рд░реНрдердХ рд╕рдорд╛рдзрд╛рди рд╣реИред

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдлрд╝реЛрд▓реНрдбрд░ рд╕рдВрд░рдЪрдирд╛




рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдлреНрд░рдВрдЯ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдкрд░реЛрд╕рд╛ рдЬрд╛рдПрдЧрд╛, рдПрдХ index.html рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдФрд░ рд╢реИрд▓рд┐рдпреЛрдВ рдФрд░ рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рд╣реИрдВред

Src рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рд╛рдЙрдЯрд░ рдФрд░ рдПрдкреАрдЖрдИ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рдЬрдбрд╝реЗрдВ, рдФрд░ рджреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рд╣реИрдВ, рдореЙрдбрд▓ рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдПред

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдореВрд▓ рдореЗрдВ рдПрдХ рд░реЛрд▓рдЕрдк.рдХреЙрдиреНрдлрд╝рд┐рдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

rollup тАУc

Github.com рдкрд░ рдЙрдкрд▓рдмреНрдз рдХреЛрдб рдХреЗ рд▓рдВрдмреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд╕рд╛рде рдкрд╛рдардХ рдХреЛ рдмреЛрд░ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП , рдореИрдВ рдХреЗрд╡рд▓ рдорд╛рдЗрдЯреНрд░рд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдореВрд▓ рддрддреНрд╡реЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░реВрдВрдЧрд╛ред

рдПрдкреАрдЖрдИ рдФрд░ рд░рд╛рдЙрдЯрд░


рдПрдкреАрдЖрдИ рдХреЛрдб:

// used by backend server
export const restApi= {
  notes: { url: 'notes', editable: ['add', 'edit', 'del'] }
}

// used by routers
export const appApi = {
  root: "/",
}
// used by navBar
// here array of arrays though it may be hash eg
export const appMenu = [
  [`${appApi.root}`, 'Home'],
  [`${appApi.root}`, 'About'],
  [`${appApi.root}`, 'Contacts'],
]

рдореИрдВрдиреЗ REST рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдФрд░ рд░рд╛рдЙрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ред

рд░реВрдЯрд░:

import { restApi, appApi } from './appApi';
import { moModel } from './model/moModel';
import { vuView, vuApp } from './view/vuApp';
import { vuNavBar } from './view/vuNavBar';

// application router
const appRouter = { [appApi.root]: {
  render() {
    const view = m(vuApp, {
      model: moModel.getModel( restApi.notes ),
    });
    return vuView( {menu: vuNavBar}, view);
  }
}};

// once per app
m.route(document.body, "/", appRouter);

рдпрд╣рд╛рдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмреЙрдбреА рдкрд░ рд░рд╛рдЙрдЯрд░ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд░рд╛рдЙрдЯрд░ рд╕реНрд╡рдпрдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬреЛ рдЗрд╕ рдорд╛рд░реНрдЧ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рд░реНрдЧреЛрдВ рдФрд░ рдШрдЯрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рд░реЗрдВрдбрд░ () рдлрд╝рдВрдХреНрд╢рди рдХреЛ vnode рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

AppApi рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рднреА рдорд╛рдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ appMenu рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдВрднрд╡ рдиреЗрд╡рд┐рдЧреЗрд╢рди рддрддреНрд╡реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред

рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди, рдЬрдм рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЙрдбрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд░реВрдЯ рдиреЛрдб рдореЗрдВ рднреЗрдЬрддрд╛ рд╣реИред

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЙрдбрд▓


рд╕рдВрд░рдЪрдирд╛ рдЬреЛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИ, рдореИрдВрдиреЗ рдореЙрдбрд▓ рдХреЛ рдмреБрд▓рд╛рдпрд╛ред рдореЙрдбрд▓ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб:

getModel(
    {url=null, method="GET", order_by='id', editable=null} = {}
  ) {
/**
  * url - string of model's REST API url
  * method - string of model's REST method
  * order_by - string "order by" with initially SELECT 
  * editable - array defines is model could changed
*/
    const model = {
      url: url,
      method: method,
      order_by: order_by,
      editable: editable,
      key: order_by, // here single primary key only
      list: null, // main data list 
      item: {}, // note item
      error: null, // Promise error
      save: null, // save status
      editMode: false, // view switch flag
      word: '' // dialog header word
    };  
    model.getItem= id => {
      model.item= {};
      if ( !id ) {
        model.editMode= true;
        return false;
      }
      const key= model.key;
      for ( let it of model.list ) {
        if (it[key] == id) {
          model.item= Object.assign({}, it);
          break;
        }
      }
      return false;
    };
    return model;
  },

рдпрд╣рд╛рдВ рдЗрд╕реЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрджрд░ рдХреЗ рд▓рд┐рдВрдХ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд▓рд┐рдВрдХ рдЕрдкрдиреЗ рдЖрдк рд╕реНрдерд┐рд░ рд░рд╣рддрд╛ рд╣реИред

GetModel рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реИрд╢реНрд╡рд┐рдХ moModel рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ m.request () рдорд╛рдЗрдЯреНрд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд░рдг рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВ, рдпреЗ getList (рдореЙрдбрд▓), рдФрд░ formSubmit (рдИрд╡реЗрдВрдЯ, рдореЙрдбрд▓, рд╡рд┐рдзрд┐) рд╣реИрдВред рдореЙрдбрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджрд░реНрдн рд╣реИ, рдЗрд╡реЗрдВрдЯ рдШрдЯрдирд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬреЛ рдлреЙрд░реНрдо рд╕рдмрдорд┐рдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рд╡рд┐рдзрд┐ HTTP рдкрджреНрдзрддрд┐ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдиреЛрдЯ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (POST рдПрдХ рдирдпрд╛ рдиреЛрдЯ рд╣реИ, PATCH, DELETE рдкреБрд░рд╛рдирд╛ рд╣реИ)ред

рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡


рджреГрд╢реНрдп рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдкреГрд╖реНрда рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ 4 рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛:

  • vuApp - рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдореВрд▓ рдШрдЯрдХ,
  • vuNavBar - рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╛рд░,
  • vuNotes - рдиреЛрдЯреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА,
  • vuNoteForm - рдиреЛрдЯ рд╕рдВрдкрд╛рджрди рдлрд╝реЙрд░реНрдо,
  • vuDialog - HTML рд╕рдВрд╡рд╛рдж рддрддреНрд╡

рд░рд╛рдЙрдЯрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ vuView (рдореЗрдиреВ, рджреГрд╢реНрдп) рдПрдХ рд╣реА рдорд╛рд░реНрдЧ рдкрд░ рд▓реМрдЯрд╛ рд╣реИред

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛:

export const vuView= (appMenu, view)=> m(vuMain, appMenu, view);

рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЖрд╡рд░рдг рд╣реИ рдЬреЛ vuMain рдШрдЯрдХ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЕрдЧрд░ appMenu рдСрдмреНрдЬреЗрдХреНрдЯ рдмрд╛рд╣рд░реА рд╡рд╕реНрддреБ рдХреА рддрд░рд╣ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЯрд┐рд▓ рд╣реИ, рддреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд░реИрдкрд░ рд╡рд┐рднрд┐рдиреНрди рдиреЗрд╡рд┐рдЧреЗрд╢рди рддрддреНрд╡реЛрдВ рдФрд░ рдмрдЪреНрдЪреЗ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдШрдЯрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрдкрдпреБрдХреНрдд рддрд░реАрдХрд╛ рд╣реИ (рдЖрдкрдХреЛ рдмрд╕ рдХрдо рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ) ред

VuMain рдШрдЯрдХ:

const vuMain= function(ivnode) {
  // We use ivnode as argument as it is initial vnode
  const { menu }= ivnode.attrs;
  return { view(vnode) {
    // IMPORTANT !
    // If we use vnode inside the view function we MUST provide it for view
    return [
      m(menu),
      m('#layout', vnode.children)
    ];
  }};
};

рдпрд╣ рдХреЗрд╡рд▓ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ vnodes рдФрд░ рдкреГрд╖реНрда рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рдж, рдЬрд╣рд╛рдВ рдПрдХ рдШрдЯрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдореИрдВ рдХреНрд▓реЛрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдкреГрд╖реНрда рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдХреНрд▓реЛрдЬрд╝рд░ рдХреЛ рдПрдХ рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕рднреА рдкрд╛рд░рд┐рдд рд▓рд┐рдВрдХ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдж рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдПрдХ рдШрдЯрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡реЗрджрди рд╕рд╛рдордЧреНрд░реА рдШрдЯрдХ:

export const vuApp= function(ivnode) {
  const { model }= ivnode.attrs;
  //initially get notes
  moModel.getList( model );
  
  return { view() { 
    return [
      m(vuNotes, { model }),
      m(vuNoteForm, { model }),
      vuModalDialog(model)
    ];
  }};
}

рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдореЙрдбрд▓ рд╣реИ, рдЬрдм рдореИрдВ рдПрдХ рдХреЙрд▓ рдХреЛ рдмрдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдиреЛрдЯреЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдкреГрд╖реНрда рдкрд░ рддреАрди рдШрдЯрдХ рд╣реЛрдВрдЧреЗ:

  • vuNotes - рдРрдб рдмрдЯрди рдХреЗ рд╕рд╛рде рдиреЛрдЯреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА,
  • vuNoteForm - рдиреЛрдЯ рд╕рдВрдкрд╛рджрди рдлрд╝реЙрд░реНрдо,
  • vuModalDialog - рдПрдХ рд╕рдВрд╡рд╛рдж рддрддреНрд╡ рдЬрд┐рд╕реЗ рд╣рдо рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдПрдВрдЧреЗ, рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рд╕реНрд▓реИрдо рдХрд░реЗрдВрдЧреЗред

рдЪреВрдВрдХрд┐ рдЗрди рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЦреБрдж рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

рдШрдЯрдХ рдиреЛрдЯ рд╕реВрдЪреА:

//Notes List
export const vuNotes= function(ivnode) {
  const { model }= ivnode.attrs;
  const _display= ()=> model.editMode ? 'display:none': 'display:block';
  const vuNote= noteItem(model); // returns note function
  
  return { view() {
    return model.error ? m('h2', {style: 'color:red'}, model.error) :
    !model.list ? m('h1', '...LOADING' ) :
    m('div', { style: _display() }, [
      m(addButton , { model } ),
      m('.pure-g', m('.pure-u-1-2.pure-u-md-1-1',
        m('.notes', model.list.map( vuNote ) )
      ))
    ]);
  }};
}

рдмреВрд▓ editMode рдзреНрд╡рдЬ рдХреЛ рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдпрджрд┐ рдзреНрд╡рдЬ рдХрд╛ рдорд╛рди рд╕рддреНрдп рд╣реИ, рддреЛ рд╣рдо рд╕рдВрдкрд╛рджрди рдлрд╝реЙрд░реНрдо рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ - рдиреЛрдЯреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреАред рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХреЛ рдПрдХ рд╕реНрддрд░ рдЕрдзрд┐рдХ рдКрдВрдЪрд╛ рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рд░ рдмрд╛рд░ рдзреНрд╡рдЬ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдкрд░ рд╡рд░реНрдЪреБрдЕрд▓ рдиреЛрдбреНрд╕ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ DOM рдиреЛрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрджрд▓ рдЬрд╛рдПрдЧреА, рдФрд░ рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рдо рд╣реИред

рдпрд╣рд╛рдВ рд╣рдо рдорд┐рдЯреНрд░рд┐рд▓ рдХреЗ рд▓рд┐рдП рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рд╣реИрдВ, рд╣рдо рдПрдХ рдкреГрд╖реНрда рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбрд▓ рдореЗрдВ рдореМрдЬреВрджрдЧреА рдпрд╛ рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣рд╛рдБ рд╡рд╣ рдХреНрд▓реЛрдЬрд░ рд╣реИ рдЬреЛ рдиреЛрдЯ рдбрд┐рд╕реНрдкреНрд▓реЗ рдлрдВрдХреНрд╢рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ:

const noteItem= model=> {
  // click event handler
  const event= ( msg, word='', time=null)=> e=> {
    model.getItem(e.target.getAttribute('data'));
    if ( !!msg ) {
      model.save= { err: false, msg: msg };
      model.word= word;
      if ( !!time )
        model.item.completed= time;
      vuDialog.open();
    } else {
      model.editMode= true;
    }
  };
  // trash icon's click handler
  const _trash= event('trash', 'Dlelete');
  
  // check icon's click handler
  const _check= event('check', 'Complete',
    // postgre timestamp string
    new Date().toISOString().split('.')[0].replace('T', ' '));
  
  // edit this note
  const _edit= event('');
  
  const _time= ts=> ts.split('.')[0];
  
  // Single Note 
  const _note= note=> m('section.note', {key: note.id}, [
    m('header.note-header', [ m('p.note-meta', [
      // note metadata
      m('span', { style: 'padding: right: 3em' }, `Created: ${_time( note.created )}`),
      note.completed ? m('span', `  Completed: ${_time( note.completed )}`) : '', 
      // note right panel 
      m('a.note-pan', m('i.fas.fa-trash', { data: note.id, onclick: _trash } )),
      note.completed ? '' : [
        m('a.note-pan', m('i.fas.fa-pen', {data: note.id, onclick: _edit } )),
        m('a.note-pan', m('i.fas.fa-check', { data: note.id, onclick: _check} ))
      ]
    ]),
      m('h2.note-title', { style: note.completed ? 'text-decoration: line-through': ''}, note.title)
    ]),
    m('.note-content', m('p', note.content))
  ]);
  return _note;
}

рд╕рднреА рдХреНрд▓рд┐рдХ рд╣реИрдВрдбрд▓рд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВред рдореЙрдбрд▓ рдХреЛ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рдиреЛрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреИрд╕реЗ рд╕рдВрд░рдЪрд┐рдд рд╣реИ, рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдкреНрд░рдореБрдЦ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдореЙрдбрд▓ рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рддрддреНрд╡ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕реВрдЪреА рд╕рд░рдгреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдШрдЯрдХ рдХреЛ рдпрд╣ рдЬрд░реВрд░ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдиреЛрдЯ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдо рдХрд╛ рдкреВрд░рд╛ рдкрд╛рда рдирд╣реАрдВ рджреВрдВрдЧрд╛; рд╣рдо рдХреЗрд╡рд▓ рдлреЙрд░реНрдо рд╕рдмрдорд┐рдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ:

// form submit handler
  const _submit= e=> {
    e.preventDefault();
    model.item.title= clean(model.item.title);
    model.item.content= clean(model.item.content);
    const check= check_note(model.item);
    if ( !!check ) {
      model.save= { err: true, msg: check }; 
      model.word= 'Edit';
      vuDialog.open();
      return false;
    } 
    return moModel.formSubmit(e, model, _method() ).then(
      ()=> { model.editMode=false; return true;}).catch(
      ()=> { vuDialog.open(); return false; } );
  };

рдЪреВрдВрдХрд┐ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рд╣реЛрддреА рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реИ, рдФрд░ рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рдж рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ: рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдлреЙрд░реНрдо рджрд┐рдЦрд╛рдиреЗ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз, рдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ - рддреНрд░реБрдЯрд┐ рдкрд╛рда рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд╡рд╛рдж рдЦреЛрд▓рдирд╛ред

рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдмреИрдХрдПрдВрдб рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдиреЛрдЯреЛрдВ рдХреА рд╕реВрдЪреА рдлрд┐рд░ рд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реЛрддреА рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕реВрдЪреА рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрд╡рд╛рдж рдШрдЯрдХ рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВрдиреЗ рдШрдЯрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╕реНрддреБ рд╢рд╛рдмреНрджрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд┐рдВрдбреЛ рдЦреЛрд▓рдиреЗ рдФрд░ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдВред

рдирд┐рд╖реНрдХрд░реНрд╖


рд╣рдордиреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ mithril.js рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдПрд╕рдкреАрдП рдЖрд╡реЗрджрди рд▓рд┐рдЦрд╛ рдерд╛, рдЬреЛ рдЗрд╕ рдврд╛рдВрдЪреЗ рдХреЗ рдореБрд╣рд╛рд╡рд░реЛрдВ рдХреЗ рд╕рд╛рде рд░рд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рд╣реИред рд╢рд╛рдпрдж рдПрдХрджрдо рд╕рд╛рдл рдирд╣реАрдВред рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рдХреЛрдб рдХреЗ рдЫреЛрдЯреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░рдиреЗ, рдПрдХ рдШрдЯрдХ рдХреЗ рдпрд╛рдВрддреНрд░рд┐рдХреА рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдФрд░ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

All Articles