Backbone.js рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рд▓рд┐рдЦрдирд╛

рдЫрд╡рд┐

Backbone.js RIA рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд░реВрдкрд░реЗрдЦрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓реЗрдЦрдХ рдЬреЗрд░реЗрдореА рдПрд╢рдХреЗрдирд╕ рд╣реИрдВ, рдЬреЛ рдХреЙрдлрд╝реАрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИрдВ, рдмреИрдХрдмреЛрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреНрд▓рд╛рдЙрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрдВрдбрд░рд╕реНрдХреЛрд░.рдЬреЗрдПрд╕ рджреНрд╡рд╛рд░рд╛ "рд╕реНрд╡рд╛рдорд┐рддреНрд╡" рд╣реИред рдмреИрдХрдмреЛрди рдПрдХ рдмрд╣реБрдд рд╣рд▓реНрдХрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдмреИрдХрдмреЛрди рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ, рдЬреЛ рдЖрдХрд╛рд░ рдореЗрдВ 4Kb рд╕реЗ рдХрдо рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рдХреЛрдб рдХреА рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдПрдорд╡реАрд╕реА рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред
рдмреИрдХрдмреЛрди рдХреБрдВрдЬреА-рдореВрд▓реНрдп-рд╕рдВрдЧреНрд░рд╣рдг рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдИрд╡реЗрдВрдЯ, рд╕рдореГрджреНрдз рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣, рд╡рд┐рдЪрд╛рд░рд╢реАрд▓ (рдореВрд▓ рд╡рд┐рдЪрд╛рд░) рдХреЗ рд╕рд╛рде рдореЙрдбрд▓ рдкреЗрд╢ рдХрд░рдХреЗ рднрд╛рд░реА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рддрд╛ рд╣реИ, рдШреЛрд╖рдгрд╛рддреНрдордХ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдм рдПрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдПрдХ RESTful JJ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдмрд┐рдирд╛ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдХреЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред REST API рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдФрд░ Backbone.View рдореЗрдВ DOM рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, json2.js рдФрд░ jQuery рдЬреИрд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ: jQuery рдпрд╛ Zepto

рд▓реЗрдЦ Backbone.js рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛, рдФрд░ рдЪрд░рдгреЛрдВ рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдЯреЛрдбреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣рд╛рдБ рд╡реЗ рд▓рд╛рдн рд╣реИрдВ рдЬреЛ рдмреИрдХрдмреЛрди рд╣рдореЗрдВ рджреЗрддрд╛ рд╣реИред

рдХреА-рд╡реИрд▓реНрдпреВ рд╕реНрдЯреЛрд░реЗрдЬ рдФрд░ рдХрд╕реНрдЯрдо рдЗрд╡реЗрдВрдЯреНрд╕


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

рд╕рдореГрджреНрдз рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдореГрджреНрдз рдПрдкреАрдЖрдИ


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

рдШреЛрд╖рдгрд╛рддреНрдордХ рдШрдЯрдирд╛ рдХреЗ рджреГрд╢реНрдп


рдЬрд┐рди рджрд┐рдиреЛрдВ рдЖрдкрдиреЗ рд╕реНрдкреЗрдЧреЗрдЯреА-рдЬреИрд╕реЗ рдХреЛрдб рд▓рд┐рдЦреЗ рдереЗ, рд╡реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рд░рд╣реЗ рд╣реИрдВред рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реА рдХреЙрд▓рдмреИрдХ рдХрд┐рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдЬреБрдбрд╝реА рд╣реИред

RESTful JSON рдЗрдВрдЯрд░рдлрд╝реЗрд╕


рдпрджрд┐ рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ "рджреГрд╢реНрдп" рдХреЛрдб рдореЗрдВ рдПрдХ AJAX рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ рд╡рд╣ рдорд┐рд▓реЗрдЧрд╛ред рдпрд╣ рд╕рдм рд╡рд┐рднрд┐рдиреНрди xhr рдПрдбреЗрдкреНрдЯрд░, рд╡реЗрдм рдкреЙрдХреЗрдЯреНрд╕ рдФрд░ рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рд░рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдЗрдХрд╛рдИ рдХреЛ рдХрдИ рдЫреЛрдЯреЗ рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмреИрдХрдмреЛрди рдЗрд╕рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛:
рдмреИрдХрдмреЛрди рд╣рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╕реНрддреБрддрд┐ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рджреЗрддрд╛ рд╣реИред рдПрдХ рдореЙрдбрд▓ рдЬреЛ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдЬрдм рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреЛ рд╕реБрдирддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓рддрд╛ рд╣реИ (HTML рдореЗрдВ рдбреНрд░рд╛ рдХрд░рддрд╛ рд╣реИ)
рдореИрдВ рддреБрд░рдВрдд рдЙрди рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдЙрддреНрддрд░ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдЕрдм рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

рдХреНрдпрд╛ рдпрд╣ jQuery рдХреА рдЬрдЧрд╣ рд▓реЗрддрд╛ рд╣реИ?

рдирд╣реАрдВред рд╡реЗ рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдп рдореЗрдВ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИрдВред рдмреИрдХрдмреЛрди рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЕрдореВрд░реНрдд рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ jQuery рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдбреЛрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред

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

рдореИрдВ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реВрдВ?

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

рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣рд╛рдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

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

рдЗрд╕рдХреЗ рд╕рд╛рде, рдЖрдк рд╕рд░рд▓ HTML рдкреЗрдЬ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рдореГрджреНрдз рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрдбрд╝реЗ рдФрд░ рдмреИрдХрдмреЛрди рдХреЛ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдХреИрдкреНрдкреБрдХрд┐рдиреЛ рдпрд╛ рд╕реНрдкреНрд░рд╛рдЙрдЯрдХреЛрд░ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ?

рд╣рд╛рдБ рдФрд░ рдирд╣реАрдВред рд╣рд╛рдВ, рдХреНрдпреЛрдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЙрдкрд░реНрдпреБрдХреНрдд рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдореЗрдВ рд╣реИ, рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдирд╛ рд╣реИред рд╡реЗ рдЗрд╕ рдмрд╛рдд рдореЗрдВ рднрд┐рдиреНрди рд╣реИрдВ рдХрд┐ рдмреИрдХрдмреЛрди рдмрд╣реБрдд рд╣рд▓реНрдХрд╛ рд╣реИ, рдЙрдкрд░реЛрдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдмреИрдХрдмреЛрди рдмреЗрд╣рдж рд╣рд▓реНрдХрд╛ рд╣реИ, 4kb рд╕реЗ рдХрдо рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, 4kb рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИ: Backbone 4kb + Underscore.js 3kb + jQuery 31KH = 38kb

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

рдХреНрдпрд╛ рдореИрдВ рдмреИрдХрдмреЛрди рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рдмреЗрд╢рдХред рди рдХреЗрд╡рд▓ DOM, AJAX рдХреЗ рд░реИрдкрд░ рддрдХ рдкрд╣реБрдВрдЪ, рдмрд▓реНрдХрд┐ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдбрд░ рднреАред рдмреИрдХрдмреЛрди рдореЗрдВ рдмрд╣реБрдд, рдмрд╣реБрдд рд╢рд┐рдерд┐рд▓ рдпреБрдЧреНрдорд┐рдд рд╣реИ - рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдмреИрдХрдмреЛрди рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЕрдкрдиреЗ рд▓рдЧрднрдЧ рд╕рднреА рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдмреИрдХрдмреЛрди рдмрдирд╛рдПрдБ


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдмреИрдХрдмреЛрди рдореЗрдВ рдХреЗрд╡рд▓ рдореЙрдбрд▓, рджреГрд╢реНрдп рдФрд░ рд╕рдВрдЧреНрд░рд╣ рд╢рд╛рдорд┐рд▓ рдереЗ - рдирд┐рдпрдВрддреНрд░рдХ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдереЗред рд╕рдордп рдХреЗ рд╕рд╛рде, рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред рдмреИрдХрдмреЛрди рдореЗрдВ рдЕрдм 4 рдореБрдЦреНрдп рд╡рд░реНрдЧ рд╣реЛрддреЗ рд╣реИрдВ:
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдореБрдЦреНрдп рдХрдХреНрд╖рд╛рдУрдВ рдкрд░ рдЬрд╛рдПрдВ, рдлрд┐рд░ рдЗрд╕ рдЬреНрдЮрд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рдо рдПрдХ рд╕рд░рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВрдЧреЗред

рдЖрджрд░реНрд╢

рд╡рд┐рднрд┐рдиреНрди рдЪреАрдЬреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ MVC рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдореЙрдбрд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдмреИрдХрдмреЛрди рдореЗрдВ, рдПрдХ рдореЙрдбрд▓ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЗрдХрд╛рдИ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдирд┐рдХрдЯрддрдо рдПрдирд╛рд▓реЙрдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рд╣реИред рд▓реЗрдХрд┐рди рдХреЛрдИ рдХрдард┐рди рдФрд░ рддреЗрдЬрд╝ рдирд┐рдпрдо рдирд╣реАрдВ рд╣реИрдВред рдлреНрд░реЗрдорд╡рд░реНрдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ:
рдореЙрдбрд▓ рдЙрди рд╕рднреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рджрд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╕рдВрд╡рд╛рджрд╛рддреНрдордХ рдбреЗрдЯрд╛ рдФрд░ рд╕рд╛рде рд╣реА рдЕрдзрд┐рдХрд╛рдВрд╢ рддрд░реНрдХ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдлрд╝реНрд░реЗрдо рдХрд░рддреЗ рд╣реИрдВ: рдкрд░рд┐рд╡рд░реНрддрди, рд╕рддреНрдпрд╛рдкрди, рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдФрд░ рдПрдХреНрд╕реЗрд╕ рдЕрдзрд┐рдХрд╛рд░ред
рдПрдХ рдореЙрдбрд▓ рдПрдХ рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ рдЧреБрдг рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЙрдбрд▓ рд╣реИ:
var Game = Backbone.Model.extend({}); 

рдЖрдЗрдП рдЪреАрдЬреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдХрд░реЗрдВ:
 var Game = Backbone.Model.extend({ initialize: function(){ alert("Oh hey! "); }, defaults: { name: 'Default title', releaseDate: 2011, } }); 

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

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдПрдБ:
 //    var portal = new Game({ name: "Portal 2", releaseDate: 2011}); //     releaseDate var release = portal.get('releaseDate'); // 2011 //    portal.set({ name: "Portal 2 by Valve"}); 

рдЖрдк рд╕реАрдзреЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ (object.attribute), рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдпрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЬрд╛рдПрдЧреА)ред
рдЕрдм рд╕рд╛рд░рд╛ рдбрд╛рдЯрд╛ рдПрдкреНрд▓реАрдХреЗрд╢рди рдореЗрдореЛрд░реА рдореЗрдВ рд╣реИред рдЪрд▓реЛ рдЙрдиреНрд╣реЗрдВ рд╕рд░реНрд╡рд░ рдкрд░ рд╕рд╣реЗрдЬреЗрдВ:
 portal.save(); 

рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХреБрдЫ рдЬреНрдпрд╛рджрд╛ рдХреА рдЙрдореНрдореАрдж рдереА? AJAX? рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд╣рдо рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреЗ рд╣реИрдВред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЕрдиреБрд░реЛрдз рдХрд╛ рдкреНрд░рдХрд╛рд░ рдмрджрд▓рддрд╛ рд╣реИ: рдпрджрд┐ рдЖрдк рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ POST рдЕрдиреБрд░реЛрдз рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛, рдЕрдиреНрдпрдерд╛ PUT рд╣реЛрдЧрд╛ред
рдореИрдВрдиреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдореЙрдбрд▓реЛрдВ рдкрд░ рдЫреБрдЖред рдмреИрдХрдмреЛрди рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╡рд░рдг рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрдЧреНрд░рд╣

рдмреИрдХрдмреЛрди рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдХреЗрд╡рд▓ рдореЙрдбрд▓реЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛, рдпреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдореЙрдбрд▓) рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВред
рдЪрд▓реЛ рдЦреЗрд▓ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рдПрдБ:
 var GamesCollection = Backbone.Collection.extend({ model : Game }); 

рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдкрд╣рд▓реА рдмрд╛рдд, рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдХреМрди рд╕реЗ рдореЙрдбрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╣рдордиреЗ рдЧреЗрдо рдореЙрдбрд▓ рд╕реЗ рдорд┐рд▓рдХрд░ рдЧреЗрдореНрд╕ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рдпрд╛ рд╣реИред

рдЕрдм рдЖрдк рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрд▓рд┐рдП рдкреБрд░рд╛рдиреЗ рдЦреЗрд▓реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкрджреНрдзрддрд┐ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
 var GamesCollection = Backbone.Collection.extend({ model : Game, old : function() { return this.filter(function(game) { return game.get('releaseDate') < 2009; }); } }); 

рд╕рд░рд▓, рд╕рд╣реА? рд╣рдо рд╕рд┐рд░реНрдл рдЙрди рдЦреЗрд▓реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ 2009 рд╕реЗ рдкрд╣рд▓реЗ рдмрдирд╛рдП рдЧрдП рдереЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ред рдЖрдк рд╕реАрдзреЗ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдкреНрд░рдмрдВрдзрди рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 var games = new GamesCollection games.get(0); 

рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдирдпрд╛ рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ ID 0. рдХреЗ рд╕рд╛рде рдореЙрдбрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рддрддреНрд╡ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: games.at(0);

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЖрдк рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрдкрдиреЗ рд╕рдВрдЧреНрд░рд╣ рдХреА рднрд░рдкрд╛рдИ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 var GamesCollection = Backbone.Collection.extend({ model : Game, url: '/games' }); var games = new GamesCollection games.fetch(); 


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

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

рд░рд╛рдп

рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рджреГрд╢реНрдп рднреНрд░рд╛рдордХ рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВред рд╢реБрджреНрдз рдПрдорд╡реАрд╕реА рдХреЗ рд╡рд┐рдкрд░реАрдд, рдмреИрдХрдмреЛрди рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рдкреНрд░рдЬрд╛рддрд┐рдпреЛрдВ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рджреГрд╢реНрдп рдмрдирд╛рдПрдБ:
 var GameView = Backbone.View.extend({ tagName: "div", className: "game", render: function() { //    } }); 

рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдореИрдВ рдмрд╕ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рджреГрд╢реНрдп рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ HTML рддрддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЯреИрдЧрдирд╛рдо рдФрд░ рдХреНрд▓рд╛рд╕рдиреЗрдо)ред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдПрдХ рджреГрд╢реНрдп рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ:
  render : function() { this.el.innerHTML = this.model.get('name'); //   jQuery: $(this.el).html(this.model.get('name')); } 

el рдЙрд╕ рддрддреНрд╡ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рджреГрд╢реНрдп рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдмрд╕ HTML рдПрд▓рд┐рдореЗрдВрдЯ рдореЗрдВ рдЧреЗрдо рдХрд╛ рдирд╛рдо рдбрд╛рд▓рддреЗ рд╣реИрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, jQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рд╣реИред

рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрдВрджрд░ HTML рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдердХрд╛рдК рдФрд░ рд╡реНрдпрд░реНрде рд╣реИред рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред

рдмреИрдХрдмреЛрди рдХрд╛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдЯреЗрдВрдкрд▓реЗрдЯрд┐рдВрдЧ рдЗрдВрдЬрди (рдЕрдВрдбрд░рд╕реНрдХреЛрд░.рдЬреЗрдПрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛) рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред

рдЕрдВрдд рдореЗрдВ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдкреНрд░рдЬрд╛рддрд┐рдпрд╛рдВ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╕реБрдирддреА рд╣реИрдВред рдкрд╣рд▓реЗ DOM рдЗрд╡реЗрдВрдЯред
 events: { 'click .name': 'handleClick' }, handleClick: function(){ alert('In the name of science... you monster'); // Other actions as necessary } 

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

рдЕрдм рд╣рдо рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдореЙрдбрд▓ рд╕реЗ рдЬреЛрдбрд╝реЗрдВрдЧреЗ:
 var GameView = Backbone.View.extend({ initialize: function (args) { _.bindAll(this, 'changeName'); this.model.bind('change:name', this.changeName); } }); 

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

bindAll рдПрдХ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдЗрд╕ рд╕рдВрджрд░реНрдн рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рдВрдзрддреА рд╣реИред рдпрд╣ рдШрдЯрдирд╛рдУрдВ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИред

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

рдирд┐рдпрдВрддреНрд░рдХ

рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдиреЗ рдЖрдкрдХреЛ рдРрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рд╣реИ рдЬреЛ рд╣реИрд╢ url (рд╣реИрд╢рдмреИрдВрдЧ) рдореЗрдВ рдЕрдкрдиреЗ рд░рд╛рдЬреНрдп рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВред
 var Hashbangs = Backbone.Controller.extend({ routes: { "!/": "root", "!/games": "games", }, root: function() { //      }, games: function() { //      } }); 

рдпрд╣ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕рд░реНрд╡рд░ MVC рдЪреМрдЦрдЯреЗ рдореЗрдВ рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП !/games рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрдЧрд╛ рдЬрдмрдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ URL domain/#!/games ред

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

рдЕрдЧрд░ рдЖрдкрдХреЛ рдбрд░ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдмреИрдХ рдмрдЯрди рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛, рддреЛ рдмреИрдХрдмреЛрди рдЗрд╕рдХреА рджреЗрдЦрднрд╛рд▓ рдХрд░ рд╕рдХрддреА рд╣реИред
 //   var ApplicationController = new Controller; Backbone.history.start(); 

рдмреИрдХрдмреЛрди #hash рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИ рдФрд░ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЕрдм рдЬрдм рдЖрдк рдмреИрдХрдмреЛрди рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдЗрдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

рдЙрджрд╛рд╣рд░рдг: рдЯреЛрдбреЛ рд╕реВрдЪреА


рдпрд╣ рдРрдк J├йr├┤me Gravel-Niquet рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд▓реЛрдХрд▓рд╕реНрдЯреЗрдЬ рдПрдбрд╛рдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдореИрдВ рдПрдбреЙрдкреНрдЯрд░ рдкрд░ рдирд╣реАрдВ рд░реБрдХрддрд╛, рдЗрд╕рдХреЗ рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ - рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ)ред рджреЗрдЦреЗрдВ рдХрд┐ рдХреЛрдб рдХреЛ рдмреЗрд╣рддрд░ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЦрд┐рд░ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ: рдЯреЛрдбреЛ рд╕реВрдЪреА

рдЯреБрдбреВ рдореЙрдбрд▓

рд╣рдорд╛рд░рд╛ рдЖрдзрд╛рд░ рдореЙрдбрд▓ рдПрдХ рд╕реВрдЪреА рдЯреВрдбреВ рддрддреНрд╡ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ content , order рдФрд░ done рдЧреБрдг рд╣реИрдВред
  window.Todo = Backbone.Model.extend({ //     ,    //    ,       default EMPTY: "empty todo...", //     `content`,    initialize: function() { if (!this.get("content")) { this.set({"content": this.EMPTY}); } }, //   `done` toggle: function() { this.save({done: !this.get("done")}); }, //   localStorage    clear: function() { this.destroy(); this.view.remove(); } }); 


рдЯреБрдбреВ рд╕рдВрдЧреНрд░рд╣

рдЯреБрдбреВ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  window.TodoList = Backbone.Collection.extend({ //       Todo model: Todo, //      "todos"  localStorage localStorage: new Store("todos"), //     ,   done: function() { return this.filter(function(todo){ return todo.get('done'); }); }, //     ,    remaining: function() { return this.without.apply(this, this.done()); }, //     ,          . //      GUID   .      . nextOrder: function() { if (!this.length) return 1; return this.last().get('order') + 1; }, //        comparator: function(todo) { return todo.get('order'); } }); //     window.Todos = new TodoList; 


рджреЗрдЦреЗрдВ - рдЯреБрдбреВ рддрддреНрд╡

  // DOM    window.TodoView = Backbone.View.extend({ //    tagName: "li", //   //      template: _.template($('#item-template').html()), //  DOM,     events: { "click .check" : "toggleDone", "dblclick div.todo-content" : "edit", "click span.todo-destroy" : "clear", "keypress .todo-input" : "updateOnEnter" }, // TodoView      . //     ---,     //    . initialize: function() { _.bindAll(this, 'render', 'close'); this.model.bind('change', this.render); this.model.view = this; }, //   render: function() { $(this.el).html(this.template(this.model.toJSON())); this.setContent(); return this; }, //   XSS   `jQuery.text`     setContent: function() { var content = this.model.get('content'); this.$('.todo-content').text(content); this.input = this.$('.todo-input'); this.input.bind('blur', this.close); this.input.val(content); }, //   "done"   toggleDone: function() { this.model.toggle(); }, //      edit: function() { $(this.el).addClass("editing"); this.input.focus(); }, //   ,   close: function() { this.model.save({content: this.input.val()}); $(this.el).removeClass("editing"); }, //   `enter`,    updateOnEnter: function(e) { if (e.keyCode == 13) this.close(); }, //  DOM  remove: function() { $(this.el).remove(); }, //     clear: function() { this.model.clear(); } }); 


рджреЗрдЦреЗрдВ - рдЖрд╡реЗрджрди

рдпрд╣ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХрд╛ рдореВрд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред
  window.AppView = Backbone.View.extend({ //  ,        HTML  el: $("#todoapp"), //    //      statsTemplate: _.template($('#stats-template').html()), //       ,   events: { "keypress #new-todo": "createOnEnter", "keyup #new-todo": "showTooltip", "click .todo-clear a": "clearCompleted" }, //        : //  , , .     ,   //   localStorage initialize: function() { _.bindAll(this, 'addOne', 'addAll', 'render'); this.input = this.$("#new-todo"); Todos.bind('add', this.addOne); Todos.bind('refresh', this.addAll); Todos.bind('all', this.render); Todos.fetch(); }, //   -  .   . render: function() { var done = Todos.done().length; this.$('#todo-stats').html(this.statsTemplate({ total: Todos.length, done: Todos.done().length, remaining: Todos.remaining().length })); }, //   .      `<ul>` addOne: function(todo) { var view = new TodoView({model: todo}); this.$("#todo-list").append(view.render().el); }, //    addAll: function() { Todos.each(this.addOne); }, //      newAttributes: function() { return { content: this.input.val(), order: Todos.nextOrder(), done: false }; }, //   return      -   . //            createOnEnter: function(e) { if (e.keyCode != 13) return; Todos.create(this.newAttributes()); this.input.val(''); }, //    ,   . clearCompleted: function() { _.each(Todos.done(), function(todo){ todo.clear(); }); return false; }, //      . showTooltip: function(e) { var tooltip = this.$(".ui-tooltip-top"); var val = this.input.val(); tooltip.fadeOut(); if (this.tooltipTimeout) clearTimeout(this.tooltipTimeout); if (val == '' || val == this.input.attr('placeholder')) return; var show = function(){ tooltip.show().fadeIn(); }; this.tooltipTimeout = _.delay(show, 1000); } }); //  -    window.App = new AppView; 

рдПрдиреЛрдЯреЗрд╢рди рд╡рд╛рд▓реЗ рдореВрд▓ рдХреЛ рдпрд╣рд╛рдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

HTML рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдФрд░ рд╕реАрдПрд╕рдПрд╕

  <!--  --> <div id="todoapp"> <div class="title"> <h1>Todos</h1> </div> <div class="content"> <div id="create-todo"> <input id="new-todo" placeholder="What needs to be done?" type="text" /> <span class="ui-tooltip-top" style="display:none;">Press Enter to save this task</span> </div> <div id="todos"> <ul id="todo-list"></ul> </div> <div id="todo-stats"></div> </div> </div> <!--  --> <script type="text/template" id="item-template"> <div class="todo <%= done ? 'done' : '' %>"> <div class="display"> <input class="check" type="checkbox" <%= done ? 'checked="checked"' : '' %> /> <div class="todo-content"></div> <span class="todo-destroy"></span> </div> <div class="edit"> <input class="todo-input" type="text" value="" /> </div> </div> </script> <!--  --> <script type="text/template" id="stats-template"> <% if (total) { %> <span class="todo-count"> <span class="number"><%= remaining %></span> <span class="word"><%= remaining == 1 ? 'item' : 'items' %></span> left. </span> <% } %> <% if (done) { %> <span class="todo-clear"> <a href="#"> Clear <span class="number-done"><%= done %></span> completed <span class="word-done"><%= done == 1 ? 'item' : 'items' %></span> </a> </span> <% } %> </script> 

рдореИрдВ CSS рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛, рдпрд╣ рдмрд╣реБрдд рд▓рдВрдмрд╛ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рд╖рдп рд╣реИред

рдпрд╣реА рд╣реИ, рд╣рдорд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рдЖрд╡реЗрджрди рддреИрдпрд╛рд░ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдЖрдк рдмреИрдХрдмреЛрди рд╕реЗ рдХреНрдпрд╛ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ


рдмреИрдХрдмреЛрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╕реЗ рдХреБрдЫ рд╕рдмрдХ рдЖрдк рдпрд╣рд╛рдВ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдмреИрдХрдмреЛрди рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдиреЗ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдмрджрд▓ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рдкреВрдЫреЗрдВред

рд╡реЗ рд╕реНрд░реЛрдд рдЬреЛ рд▓рд┐рдЦрддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рдереЗ


Backbone.js (рдЬрд┐рдо рд╣реЙрдХрд┐рдВрд╕) рдХреЗ рд╕рд╛рде рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдРрдкреНрд╕ рдмрдирд╛рдПрдВ
Backbone.js (рд╕рд┐рджреНрдзрд╛рд░реНрде) рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛
рдПрдбрд╛рдкреНрдЯрд░ рдмреИрдХрдмреЛрди-рд▓реЛрдХреЛрд╕реНрдЯреЛрд░реЗрдЬ
рдЯреЛрдбреЛрд╕ рдЙрджрд╛рд╣рд░рдг (рдЬреЗрд░реЛрдо рдЧреНрд░реЗрд╡рд▓ рдиреБрдХреАрдЯ)
рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде Todos.js рд╕реНрд░реЛрдд

рдФрд░ рдХреНрдпрд╛ рдкрдврд╝рдирд╛ рд╣реИ


рдЧрд┐рдЯрд╣рдм рдмреИрдХрдмреЛрди рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди
рдЬреАрдердм рдкрд░ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдкреНрд░рд▓реЗрдЦрди
рдиреЛрдб рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рднрд╛рдЧ 19: рдмреИрдХрдмреЛрди.рдЬреЗрдПрд╕ (рдПрд▓реЗрдХреНрд╕ рдпрдВрдЧ)
рдПрдХ рдмрдбрд╝реА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛ (рдореВрд▓ Addy рдЙрд╕реНрдорд╛рдиреА, рдЕрдиреБрд╡рд╛рдж trurl123 )

Source: https://habr.com/ru/post/In118782/


All Articles