JQuery рд╕реЗ Backbone рддрдХ

рдЫрд╡рд┐ рдпрд╣ рд▓реЗрдЦ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рдЖрдк рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡, рдореЙрдбрд▓, рд╕рдВрдЧреНрд░рд╣ рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреИрдХрдмреЛрди рдХреЛрдб рдореЗрдВ "рд╕рд░рд▓" jQuery рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рдкреБрдирд░реНрдЧрдард┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреБрдирд░реНрдЧрдарди рдзреАрд░реЗ-рдзреАрд░реЗ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмреИрдХрдмреЛрди рдореЗрдВ рдореБрдЦреНрдп рд╕рд╛рд░ рдХреА рд╕реНрдкрд╖реНрдЯ рд╕рдордЭ рджреЗред рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ jQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдХреЛрдб рдХреЗ рд▓рд┐рдП MVC рдпреЛрдЬрдирд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдпрд╣ рд▓реЗрдЦ рдЬреАрдердм рд╕реЗ рдЕрдиреБрд╡рд╛рдж рд╣реИ ред


рдЖрдЗрдП рдЖрд╡реЗрджрди рдХреЛрдб рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ, рдЬрд┐рд╕реЗ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреБрдирд░реНрдЧрдард┐рдд рдХрд░реЗрдВрдЧреЗред
$(document).ready(function() { $('#new-status form').submit(function(e) { e.preventDefault(); $.ajax({ url: '/status', type: 'POST', dataType: 'json', data: { text: $('#new-status').find('textarea').val() }, success: function(data) { $('#statuses').append('<li>' + data.text + '</li>'); $('#new-status').find('textarea').val(''); } }); }); }); 

 <body> <div id="new-status"> <h2>New monolog</h2> <form action=""> <textarea></textarea><br> <input type="submit" value="Post"> </form> </div> <div id="statuses"> <h2>Monologs</h2> <ul></ul> </div> </body> 

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

DOM рдФрд░ Ajax рдХрд╛ рдкреГрдердХреНрдХрд░рдг


DOM рдХреЛ рдореИрдирд┐рдкреНрдпреБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреЛ рдЕрдЬрд╛рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдФрд░ рдкрд╣рд▓рд╛ рдХрджрдо рдРрдбрд╕реНрдЯреИрдЯрд╕ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдирд╛ рд╣реИ:

рдкрд░рд┐рд╡рд░реНрддрди рдирдВрдмрд░ 1

 +function addStatus(options) { + $.ajax({ + url: '/status', + type: 'POST', + dataType: 'json', + data: { text: $('#new-status textarea').val() }, + success: function(data) { + $('#statuses ul').append('<li>' + data.text + '</li>'); + $('#new-status textarea').val(''); + } + }); +} + $(document).ready(function() { $('#new-status form').submit(function(e) { e.preventDefault(); - $.ajax({ - url: '/status', - type: 'POST', - dataType: 'json', - data: { text: $('#new-status textarea').val() }, - success: function(data) { - $('#statuses ul').append('<li>' + data.text + '</li>'); - $('#new-status textarea').val(''); - } - }); + addStatus(); }); }); 


рдЗрд╕рдХреЗ рдмрд╛рдж, "+" рдЪрд┐рд╣реНрди рдЬреЛрдбрд╝рд╛ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ "-" рд╣рдЯрд╛рдП рдЧрдП рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИред

рдмреЗрд╢рдХ, рдбреЗрдЯрд╛ рдФрд░ рд╕рдлрд▓рддрд╛ рджреЛрдиреЛрдВ рдореЗрдВ , рд╣рдо рдЕрднреА рднреА DOM рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдХреЗ рдЗрд╕ рд╕рдВрдмрдВрдз рдХреЛ рддреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП:

рдирдВрдмрд░ 2 рдмрджрд▓реЗрдВ
 function addStatus(options) { $.ajax({ url: '/status', type: 'POST', dataType: 'json', - data: { text: $('#new-status textarea').val() }, - success: function(data) { - $('#statuses ul').append('<li>' + data.text + '</li>'); - $('#new-status textarea').val(''); - } + data: { text: options.text }, + success: options.success }); } $(document).ready(function() { $('#new-status form').submit(function(e) { e.preventDefault(); - addStatus(); + addStatus({ + text: $('#new-status textarea').val(), + success: function(data) { + $('#statuses ul').append('<li>' + data.text + '</li>'); + $('#new-status textarea').val(''); + } + }); }); }); 


рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдЗрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдПрдбрд╕реНрдЯреИрдЯрд╕ рдХреЗ рдмрдЬрд╛рдп рд╕реНрдЯреЗрдЯрд╕ рд▓рд┐рдЦ рд╕рдХреЗрдВ ред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдФрд░ "рдХреНрд▓рд╛рд╕" рд╕реНрдЯреЗрдЯреНрдпреВрдЬрд╝ рдмрдирд╛рдПрдВ:

рдирдВрдмрд░ 3 рдмрджрд▓реЗрдВ
 -function addStatus(options) { +var Statuses = function() { +}; +Statuses.prototype.add = function(options) { $.ajax({ url: '/status', type: 'POST', dataType: 'json', data: { text: options.text }, success: options.success }); -} +}; $(document).ready(function() { + var statuses = new Statuses(); + $('#new-status form').submit(function(e) { e.preventDefault(); - addStatus({ + statuses.add({ text: $('#new-status textarea').val(), success: function(data) { $('#statuses ul').append('<li>' + data.text + '</li>'); $('#new-status textarea').val(''); } }); }); }); 


рджреГрд╢реНрдп рдмрдирд╛рдПрдБ


рд╣рдорд╛рд░реЗ рдлреЙрд░реНрдо рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдЕрдм рд╕реНрдЯреЗрдЯрд╕ рд╡реИрд░рд┐рдПрдмрд▓ рдкрд░ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ, рдФрд░ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдВрджрд░ рд╕рдм рдХреБрдЫ рдХреЗрд╡рд▓ DOM рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЪрд▓реЛ рдлреЙрд░реНрдо рд╣реИрдВрдбрд▓рд░ рдФрд░ рд╕рдм рдХреБрдЫ рдЕрдВрджрд░ рдПрдХ рдЕрд▓рдЧ "рд╡рд░реНрдЧ" NewStatusView рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ :

рдкрд░рд┐рд╡рд░реНрддрди рдирдВрдмрд░ 4
 var Statuses = function() { }; Statuses.prototype.add = function(options) { $.ajax({ url: '/status', type: 'POST', dataType: 'json', data: { text: options.text }, success: options.success }); }; +var NewStatusView = function(options) { + var statuses = options.statuses; + + $('#new-status form').submit(function(e) { + e.preventDefault(); + + statuses.add({ + text: $('#new-status textarea').val(), + success: function(data) { + $('#statuses ul').append('<li>' + data.text + '</li>'); + $('#new-status textarea').val(''); + } + }); + }); +}; + $(document).ready(function() { var statuses = new Statuses(); - $('#new-status form').submit(function(e) { - e.preventDefault(); - - statuses.add({ - text: $('#new-status textarea').val(), - success: function(data) { - $('#statuses ul').append('<li>' + data.text + '</li>'); - $('#new-status textarea').val(''); - } - }); - }); + new NewStatusView({ statuses: statuses }); }); 


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

5 рдирдВрдмрд░ рдмрджрд▓реЗрдВ
  var Statuses = function() { }; Statuses.prototype.add = function(options) { $.ajax({ url: '/status', type: 'POST', dataType: 'json', data: { text: options.text }, success: options.success }); }; var NewStatusView = function(options) { - var statuses = options.statuses; + this.statuses = options.statuses; - $('#new-status form').submit(function(e) { - e.preventDefault(); - statuses.add({ - text: $('#new-status textarea').val(), - success: function(data) { - $('#statuses ul').append('<li>' + data.text + '</li>'); - $('#new-status textarea').val(''); - } - }); - }); + $('#new-status form').submit(this.addStatus); }; +NewStatusView.prototype.addStatus = function(e) { + e.preventDefault(); + + this.statuses.add({ + text: $('#new-status textarea').val(), + success: function(data) { + $('#statuses ul').append('<li>' + data.text + '</li>'); + $('#new-status textarea').val(''); + } + }); +}; $(document).ready(function() { var statuses = new Statuses(); new NewStatusView({ statuses: statuses }); }); 


рд▓реЗрдХрд┐рди рдЬрдм рд╣рдо рдХреНрд░реЛрдо рдореЗрдВ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ:
рдмрд┐рдирд╛ рдкрдврд╝реЗ рдЯрд╛рдЗрдкрд░реЛрд░: рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рд╡рд┐рдзрд┐ рдХреЛ 'рдРрдб' рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛

рд╣рдореЗрдВ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдРрдбрд╕реНрдЯреИрдЯрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрд░реНрде рд╣реИред (рдпрджрд┐ рдЖрдкрдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдореИрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрдВрдХреНрд╢рди рдЗрдирд╡реЛрдХреЗрд╢рди рдФрд░ "рдЗрд╕" рдХреЛ рд╕рдордЭрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ)ред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо $ .proxy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╡рд╣ рд╕рдВрджрд░реНрдн рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдирдВрдмрд░ 6 рдХреЛ рдмрджрд▓реЗрдВ
 var Statuses = function() { }; Statuses.prototype.add = function(options) { $.ajax({ url: '/status', type: 'POST', dataType: 'json', data: { text: options.text }, success: options.success }); }; var NewStatusView = function(options) { this.statuses = options.statuses; - $('#new-status form').submit(this.addStatus); + var add = $.proxy(this.addStatus, this); + $('#new-status form').submit(add); }; NewStatusView.prototype.addStatus = function(e) { e.preventDefault(); this.statuses.add({ text: $('#new-status textarea').val(), success: function(data) { $('#statuses ul').append('<li>' + data.text + '</li>'); $('#new-status textarea').val(''); } }); }; $(document).ready(function() { var statuses = new Statuses(); new NewStatusView({ statuses: statuses }); }); 


рдЪрд▓реЛ рд╕рдлрд▓рддрд╛ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ DOM рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЬреЛ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдФрд░ рд▓рдЪреАрд▓рд╛ рдмрдирд╛рдПрдЧрд╛:

7 рдирдВрдмрд░ рдмрджрд▓реЗрдВ
 var Statuses = function() { }; Statuses.prototype.add = function(options) { $.ajax({ url: '/status', type: 'POST', dataType: 'json', data: { text: options.text }, success: options.success }); }; var NewStatusView = function(options) { this.statuses = options.statuses; var add = $.proxy(this.addStatus, this); $('#new-status form').submit(add); }; NewStatusView.prototype.addStatus = function(e) { e.preventDefault(); + var that = this; + this.statuses.add({ text: $('#new-status textarea').val(), success: function(data) { - $('#statuses ul').append('<li>' + data.text + '</li>'); - $('#new-status textarea').val(''); + that.appendStatus(data.text); + that.clearInput(); } }); }; +NewStatusView.prototype.appendStatus = function(text) { + $('#statuses ul').append('<li>' + text + '</li>'); +}; +NewStatusView.prototype.clearInput = function() { + $('#new-status textarea').val(''); +}; $(document).ready(function() { var statuses = new Statuses(); new NewStatusView({ statuses: statuses }); }); 


рдЗрд╕рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рд╣рдо рднреА рдмреИрдХрдмреЛрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрд░реАрдм рд╣реЛ рдЧрдП рд╣реИрдВред

рдИрд╡реЗрдВрдЯ рдЬреЛрдбрд╝реЗрдВ


рдЕрдЧрд▓реЗ рдЪрд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рдмреИрдХрдмреЛрди рдореЙрдбреНрдпреВрд▓ - рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдШрдЯрдирд╛рдПрдБ рдХреЗрд╡рд▓ рдХрд╣рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ: "рд╣реИрд▓реЛ, рдореИрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреБрдЫ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрдм рд╣реЛрдЧреА" рдФрд░ "рд╣реИрд▓реЛ, рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЬрд┐рд╕ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рдЖрдк рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рдереЗ рд╡рд╣ рд╣реБрдЖ?" рдпрд╣ рдбреЛрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп jQuery рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдХреНрд▓рд┐рдХ рдпрд╛ рд╕рдмрдорд┐рдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ред
Backbone рдкреНрд░рд▓реЗрдЦрди Backbone.Events рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ: "рдШрдЯрдирд╛рдХреНрд░рдо рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╡рд╕реНрддреБ рдХреЛ рдХрд╕реНрдЯрдо рдШрдЯрдирд╛рдУрдВ рдХреЛ рдмрд╛рдВрдзрдиреЗ рдФрд░ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рджреЗрддрд╛ рд╣реИред" рдкреНрд░рд▓реЗрдЦрди рд╣рдореЗрдВ рдпрд╣ рднреА рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдШрдЯрдирд╛ рдбрд┐рд╕реНрдкреИрдЪрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрдбрд░рд╕реНрдХреЛрд░.рдЬреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 var events = _.clone(Backbone.Events); 

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

рдирдВрдмрд░ 8 рдмрджрд▓реЗрдВ
 +var events = _.clone(Backbone.Events); + var Statuses = function() { }; Statuses.prototype.add = function(options) { $.ajax({ url: '/status', type: 'POST', dataType: 'json', data: { text: options.text }, success: options.success }); }; var NewStatusView = function(options) { this.statuses = options.statuses; + events.on('status:add', this.appendStatus, this); + events.on('status:add', this.clearInput, this); + var add = $.proxy(this.addStatus, this); $('#new-status form').submit(add); }; NewStatusView.prototype.addStatus = function(e) { e.preventDefault(); - var that = this; - this.statuses.add({ text: $('#new-status textarea').val(), success: function(data) { - that.appendStatus(data.text); - that.clearInput(); + events.trigger('status:add', data.text); } }); }; NewStatusView.prototype.appendStatus = function(text) { $('#statuses ul').append('<li>' + text + '</li>'); }; NewStatusView.prototype.clearInput = function() { $('#new-status textarea').val(''); }; $(document).ready(function() { var statuses = new Statuses(); new NewStatusView({ statuses: statuses }); }); 


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

рдкрд░рд┐рд╡рд░реНрддрди рдирдВрдмрд░ 9
 var events = _.clone(Backbone.Events); var Statuses = function() { }; -Statuses.prototype.add = function(options) { +Statuses.prototype.add = function(text) { $.ajax({ url: '/status', type: 'POST', dataType: 'json', - data: { text: options.text }, - success: options.success + data: { text: text }, + success: function(data) { + events.trigger('status:add', data.text); + } }); }; var NewStatusView = function(options) { this.statuses = options.statuses; events.on('status:add', this.appendStatus, this); events.on('status:add', this.clearInput, this); var add = $.proxy(this.addStatus, this); $('#new-status form').submit(add); }; NewStatusView.prototype.addStatus = function(e) { e.preventDefault(); - this.statuses.add({ - text: $('#new-status textarea').val(), - success: function(data) { - events.trigger('status:add', data.text); - } - }); + this.statuses.add($('#new-status textarea').val()); }; NewStatusView.prototype.appendStatus = function(text) { $('#statuses ul').append('<li>' + text + '</li>'); }; NewStatusView.prototype.clearInput = function() { $('#new-status textarea').val(''); }; $(document).ready(function() { var statuses = new Statuses(); new NewStatusView({ statuses: statuses }); }); 


рдкреНрд░рд╕реНрддреБрддрд┐рдпрд╛рдБ рдХреА рдмрд╛рдзреНрдпрддрд╛


NewStatusView рдореЗрдВ appendStatus рдФрд░ clearInput рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП , рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдБ рдХреНрд░рдорд╢рдГ рджреЛ рдЕрд▓рдЧ DOM рддрддреНрд╡реЛрдВ, #statuses рдФрд░ # new-status рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред рдпрд╣ рд╕рд╛рдЭрд╛ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИред рдЪрд▓рд┐рдП NewStatusView рд╕реЗ #statuses рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ StatusesView рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА рд▓реЗрддреЗ рд╣реИрдВред рдЗрд╕ рдкреГрдердХреНрдХрд░рдг рдХреЛ рд╣рдорд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдо рдИрд╡реЗрдВрдЯ рдбрд┐рд╕реНрдкреИрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рд╛рд░реНрдб рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рдпрд╣ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрдЧрд╛ред

10 рдирдВрдмрд░ рдмрджрд▓реЗрдВ
 var events = _.clone(Backbone.Events); var Statuses = function() { }; Statuses.prototype.add = function(text) { $.ajax({ url: '/status', type: 'POST', dataType: 'json', data: { text: text }, success: function(data) { events.trigger('status:add', data.text); } }); }; var NewStatusView = function(options) { this.statuses = options.statuses; - events.on('status:add', this.appendStatus, this); events.on('status:add', this.clearInput, this); var add = $.proxy(this.addStatus, this); $('#new-status form').submit(add); }; NewStatusView.prototype.addStatus = function(e) { e.preventDefault(); this.statuses.add($('#new-status textarea').val()); }; -NewStatusView.prototype.appendStatus = function(text) { - $('#statuses ul').append('<li>' + text + '</li>'); -}; NewStatusView.prototype.clearInput = function() { $('#new-status textarea').val(''); }; +var StatusesView = function() { + events.on('status:add', this.appendStatus, this); +}; +StatusesView.prototype.appendStatus = function(text) { + $('#statuses ul').append('<li>' + text + '</li>'); +}; + $(document).ready(function() { var statuses = new Statuses(); new NewStatusView({ statuses: statuses }); + new StatusesView(); }); 


рдЕрдм, рдЪреВрдВрдХрд┐ рд╡рд┐рдЪрд╛рд░ рдХреЗрд╡рд▓ рдПрдХ HTML рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

11 рдирдВрдмрд░ рдмрджрд▓реЗрдВ
 var events = _.clone(Backbone.Events); var Statuses = function() { }; Statuses.prototype.add = function(text) { $.ajax({ url: '/status', type: 'POST', dataType: 'json', data: { text: text }, success: function(data) { events.trigger('status:add', data.text); } }); }; var NewStatusView = function(options) { this.statuses = options.statuses; + this.el = $('#new-status'); events.on('status:add', this.clearInput, this); var add = $.proxy(this.addStatus, this); - $('#new-status form').submit(add); + this.el.find('form').submit(add); }; NewStatusView.prototype.addStatus = function(e) { e.preventDefault(); - this.statuses.add($('#new-status textarea').val()); + this.statuses.add(this.el.find('textarea').val()); }; NewStatusView.prototype.clearInput = function() { - $('#new-status textarea').val(''); + this.el.find('textarea').val(''); }; var StatusesView = function() { + this.el = $('#statuses'); + events.on('status:add', this.appendStatus, this); }; StatusesView.prototype.appendStatus = function(text) { - $('#statuses ul').append('<li>' + text + '</li>'); + this.el.find('ul').append('<li>' + text + '</li>'); }; $(document).ready(function() { var statuses = new Statuses(); new NewStatusView({ statuses: statuses }); new StatusesView(); }); 


рд╣рдорд╛рд░реЗ рд╡рд┐рдЪрд╛рд░, NewStatusView рдФрд░ StatusesView рдЕрднреА рднреА рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдПрдХ HTML рддрддреНрд╡ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрди рддрддреНрд╡реЛрдВ рдХреЛ рджреГрд╢реНрдп рдмрдирд╛рддреЗ рд╕рдордп рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ:

12 рдирдВрдмрд░ рдмрджрд▓реЗрдВ
 var events = _.clone(Backbone.Events); var Statuses = function() { }; Statuses.prototype.add = function(text) { $.ajax({ url: '/status', type: 'POST', dataType: 'json', data: { text: text }, success: function(data) { events.trigger('status:add', data.text); } }); }; var NewStatusView = function(options) { this.statuses = options.statuses; - this.el = $('#new-status'); + this.el = options.el; events.on('status:add', this.clearInput, this); var add = $.proxy(this.addStatus, this); this.el.find('form').submit(add); }; NewStatusView.prototype.addStatus = function(e) { e.preventDefault(); this.statuses.add(this.el.find('textarea').val()); }; NewStatusView.prototype.clearInput = function() { this.el.find('textarea').val(''); }; -var StatusesView = function() { - this.el = $('#statuses'); +var StatusesView = function(options) { + this.el = options.el; events.on('status:add', this.appendStatus, this); }; StatusesView.prototype.appendStatus = function(text) { this.el.find('ul').append('<li>' + text + '</li>'); }; $(document).ready(function() { var statuses = new Statuses(); - new NewStatusView({ statuses: statuses }); - new StatusesView(); + new NewStatusView({ el: $('#new-status'), statuses: statuses }); + new StatusesView({ el: $('#statuses') }); }); 


рдЕрдм рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде, рд╣рдо рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд jQuery рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг $ ('# рдирдИ-рд╕реНрдерд┐рддрд┐') рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреГрд╢реНрдп рдХреЛ рдЖрд░рдореНрдн рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЖрд╡рд╢реНрдпрдХ jQuery HTML рдЖрд╡рд░рдг рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП $ (' тАж' ) ред jQuery рдордХреНрдЦреА рдкрд░ рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рддреЗрдЬрд╝ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдбреЛрдо рд╣реЗрд░рдлреЗрд░ рдирд╣реАрдВ рд╣реИред

рд╣рдорд╛рд░рд╛ рдЕрдЧрд▓рд╛ рдХрджрдо рд╣рдорд╛рд░реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп .el.find рд╣рдо рдПрдХ рд╕рд░рд▓ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдЗрд╕реЗ рд▓рд┐рдЦ рд╕рдХреЗрдВ ред $ ред рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде, рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, "рдореИрдВ рдХрд┐рд╕реА рджреГрд╢реНрдп рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХреБрдЫ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП jQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рд╕рднреА HTML рдореЗрдВ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдирд╣реАрдВред" рдФрд░ рдЗрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рд╣реИ:

13 рдирдВрдмрд░ рдмрджрд▓реЗрдВ
  var events = _.clone(Backbone.Events); var Statuses = function() { }; Statuses.prototype.add = function(text) { $.ajax({ url: '/status', type: 'POST', dataType: 'json', data: { text: text }, success: function(data) { events.trigger('status:add', data.text); } }); }; var NewStatusView = function(options) { this.statuses = options.statuses; this.el = options.el; events.on('status:add', this.clearInput, this); var add = $.proxy(this.addStatus, this); - this.el.find('form').submit(add); + this.$('form').submit(add); }; NewStatusView.prototype.addStatus = function(e) { e.preventDefault(); - this.statuses.add(this.el.find('textarea').val()); + this.statuses.add(this.$('textarea').val()); }; NewStatusView.prototype.clearInput = function() { - this.el.find('textarea').val(''); + this.$('textarea').val(''); }; +NewStatusView.prototype.$ = function(selector) { + return this.el.find(selector); +}; var StatusesView = function(options) { this.el = options.el; events.on('status:add', this.appendStatus, this); }; StatusesView.prototype.appendStatus = function(text) { - this.el.find('ul').append('<li>' + text + '</li>'); + this.$('ul').append('<li>' + text + '</li>'); }; +StatusesView.prototype.$ = function(selector) { + return this.el.find(selector); +}; $(document).ready(function() { var statuses = new Statuses(); new NewStatusView({ el: $('#new-status'), statuses: statuses }); new StatusesView({ el: $('#statuses') }); }); 


рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рджреГрд╢реНрдп рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рдмреИрдХрдмреЛрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рд╣реИ - рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧред

рд╡рд┐рдЪрд╛рд░реЛрдВ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛


рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ рдмреИрдХрдмреЛрди рджреГрд╢реНрдп рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдХреБрдЫ рд╣реА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓рд┐рдЦрдиреА рд╣реЛрдВрдЧреА:

14 рдирдВрдмрд░ рдмрджрд▓реЗрдВ
  var events = _.clone(Backbone.Events); var Statuses = function() { }; Statuses.prototype.add = function(text) { $.ajax({ url: '/status', type: 'POST', dataType: 'json', data: { text: text }, success: function(data) { events.trigger('status:add', data.text); } }); }; -var NewStatusView = function(options) { - this.statuses = options.statuses; - this.el = options.el; - - events.on('status:add', this.clearInput, this); - - var add = $.proxy(this.addStatus, this); - this.$('form').submit(add); -}; +var NewStatusView = Backbone.View.extend({ + initialize: function(options) { + this.statuses = options.statuses; + this.el = options.el; + + events.on('status:add', this.clearInput, this); + + var add = $.proxy(this.addStatus, this); + this.$('form').submit(add); + } +}); NewStatusView.prototype.addStatus = function(e) { e.preventDefault(); this.statuses.add(this.$('textarea').val()); }; NewStatusView.prototype.clearInput = function() { this.$('textarea').val(''); }; NewStatusView.prototype.$ = function(selector) { return this.el.find(selector); }; var StatusesView = function(options) { this.el = options.el; events.on('status:add', this.appendStatus, this); }; StatusesView.prototype.appendStatus = function(text) { this.$('ul').append('<li>' + text + '</li>'); }; StatusesView.prototype.$ = function(selector) { return this.el.find(selector); }; $(document).ready(function() { var statuses = new Statuses(); new NewStatusView({ el: $('#new-status'), statuses: statuses }); new StatusesView({ el: $('#statuses') }); }); 


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

15 рдирдВрдмрд░ рдмрджрд▓реЗрдВ
 var events = _.clone(Backbone.Events); var Statuses = function() { }; Statuses.prototype.add = function(text) { $.ajax({ url: '/status', type: 'POST', dataType: 'json', data: { text: text }, success: function(data) { events.trigger('status:add', data.text); } }); }; var NewStatusView = Backbone.View.extend({ initialize: function(options) { this.statuses = options.statuses; this.el = options.el; events.on('status:add', this.clearInput, this); var add = $.proxy(this.addStatus, this); this.$('form').submit(add); - } + }, + + addStatus: function(e) { + e.preventDefault(); + + this.statuses.add(this.$('textarea').val()); + }, + + clearInput: function() { + this.$('textarea').val(''); + }, + + $: function(selector) { + return this.el.find(selector); + } }); -NewStatusView.prototype.addStatus = function(e) { - e.preventDefault(); - - this.statuses.add(this.$('textarea').val()); -}; -NewStatusView.prototype.clearInput = function() { - this.$('textarea').val(''); -}; -NewStatusView.prototype.$ = function(selector) { - return this.el.find(selector); -}; -var StatusesView = function(options) { - this.el = options.el; - - events.on('status:add', this.appendStatus, this); -}; -StatusesView.prototype.appendStatus = function(text) { - this.$('ul').append('<li>' + text + '</li>'); -}; -StatusesView.prototype.$ = function(selector) { - return this.el.find(selector); -}; +var StatusesView = Backbone.View.extend({ + initialize: function(options) { + this.el = options.el; + + events.on('status:add', this.appendStatus, this); + }, + + appendStatus: function(text) { + this.$('ul').append('<li>' + text + '</li>'); + }, + + $: function(selector) { + return this.el.find(selector); + } +}); $(document).ready(function() { var statuses = new Statuses(); new NewStatusView({ el: $('#new-status'), statuses: statuses }); new StatusesView({ el: $('#statuses') }); }); 


рдЕрдм, рдЪреВрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдмреИрдХрдмреЛрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЗрд╕реЗ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред $ рд╣реЗрд▓реНрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмреИрдХрдмреЛрди рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдм рд╣рдореЗрдВ рдЗрд╕реЗ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдХреНрдпреЛрдВрдХрд┐, рдмреИрдХрдмреЛрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ рдЬрдм рджреГрд╢реНрдп HTML рддрддреНрд╡ рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИред

16 рдирдВрдмрд░ рдмрджрд▓реЗрдВ
 var events = _.clone(Backbone.Events); var Statuses = function() { }; Statuses.prototype.add = function(text) { $.ajax({ url: '/status', type: 'POST', dataType: 'json', data: { text: text }, success: function(data) { events.trigger('status:add', data.text); } }); }; var NewStatusView = Backbone.View.extend({ initialize: function(options) { this.statuses = options.statuses; - this.el = options.el; events.on('status:add', this.clearInput, this); var add = $.proxy(this.addStatus, this); this.$('form').submit(add); }, addStatus: function(e) { e.preventDefault(); this.statuses.add(this.$('textarea').val()); }, clearInput: function() { this.$('textarea').val(''); }, - - $: function(selector) { - return this.el.find(selector); - } }); var StatusesView = Backbone.View.extend({ initialize: function(options) { - this.el = options.el; - events.on('status:add', this.appendStatus, this); }, appendStatus: function(text) { this.$('ul').append('<li>' + text + '</li>'); }, - - $: function(selector) { - return this.el.find(selector); - } }); $(document).ready(function() { var statuses = new Statuses(); new NewStatusView({ el: $('#new-status'), statuses: statuses }); new StatusesView({ el: $('#statuses') }); }); 


рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


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

рдирдВрдмрд░ 17 рдХреЛ рдмрджрд▓реЗрдВ
 var events = _.clone(Backbone.Events); +var Status = Backbone.Model.extend({ + url: '/status' +}); + var Statuses = function() { }; Statuses.prototype.add = function(text) { - $.ajax({ - url: '/status', - type: 'POST', - dataType: 'json', - data: { text: text }, - success: function(data) { - events.trigger('status:add', data.text); - } - }); + var status = new Status(); + status.save({ text: text }, { + success: function(model, data) { + events.trigger('status:add', data.text); + } + }); }; var NewStatusView = Backbone.View.extend({ initialize: function(options) { this.statuses = options.statuses; events.on('status:add', this.clearInput, this); var add = $.proxy(this.addStatus, this); this.$('form').submit(add); }, addStatus: function(e) { e.preventDefault(); this.statuses.add(this.$('textarea').val()); }, clearInput: function() { this.$('textarea').val(''); } }); var StatusesView = Backbone.View.extend({ initialize: function(options) { events.on('status:add', this.appendStatus, this); }, appendStatus: function(text) { this.$('ul').append('<li>' + text + '</li>'); } }); $(document).ready(function() { var statuses = new Statuses(); new NewStatusView({ el: $('#new-status'), statuses: statuses }); new StatusesView({ el: $('#statuses') }); }); 


рдХрдИ рдореЙрдбрд▓ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг


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

18 рдирдВрдмрд░ рдмрджрд▓реЗрдВ
 -var events = _.clone(Backbone.Events); - var Status = Backbone.Model.extend({ url: '/status' }); -var Statuses = function() { -}; -Statuses.prototype.add = function(text) { - var status = new Status(); - status.save({ text: text }, { - success: function(model, data) { - events.trigger("status:add", data.text); - } - }); -}; +var Statuses = Backbone.Collection.extend({ + add: function(text) { + var that = this; + var status = new Status(); + status.save({ text: text }, { + success: function(model, data) { + that.trigger("add", data.text); + } + }); + } +}); var NewStatusView = Backbone.View.extend({ initialize: function(options) { this.statuses = options.statuses; - events.on("status:add", this.clearInput, this); + this.statuses.on("add", this.clearInput, this); var add = $.proxy(this.addStatus, this); this.$('form').submit(add); }, addStatus: function(e) { e.preventDefault(); this.statuses.add(this.$('textarea').val()); }, clearInput: function() { this.$('textarea').val(''); } }); var StatusesView = Backbone.View.extend({ initialize: function(options) { + this.statuses = options.statuses; + - events.on("status:add", this.appendStatus, this); + this.statuses.on("add", this.appendStatus, this); }, appendStatus: function(text) { this.$('ul').append('<li>' + text + '</li>'); } }); $(document).ready(function() { var statuses = new Statuses(); new NewStatusView({ el: $('#new-status'), statuses: statuses }); - new StatusesView({ el: $('#statuses') }); + new StatusesView({ el: $('#statuses'), statuses: statuses }); }); 


рд╣рдо рдмреИрдХрдмреЛрди рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╣ рдореЙрдбрд▓ рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рд╕рд╣реЗрдЬрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдо рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдмреИрдХрдмреЛрди рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛:


19 рдирдВрдмрд░ рдмрджрд▓реЗрдВ
  var Status = Backbone.Model.extend({ url: '/status' }); var Statuses = Backbone.Collection.extend({ - add: function(text) { - var that = this; - var status = new Status(); - status.save({ text: text }, { - success: function(model, data) { - that.trigger("add", data.text); - } - }); - } + model: Status }); var NewStatusView = Backbone.View.extend({ initialize: function(options) { this.statuses = options.statuses; this.statuses.on("add", this.clearInput, this); var add = $.proxy(this.addStatus, this); this.$('form').submit(add); }, addStatus: function(e) { e.preventDefault(); - this.statuses.add(this.$('textarea').val()); + this.statuses.create({ text: this.$('textarea').val() }); }, clearInput: function() { this.$('textarea').val(''); } }); var StatusesView = Backbone.View.extend({ initialize: function(options) { this.statuses = options.statuses; this.statuses.on("add", this.appendStatus, this); }, - appendStatus: function(text) { + appendStatus: function(status) { - this.$('ul').append('<li>' + text + '</li>'); + this.$('ul').append('<li>' + status.get("text") + '</li>'); } }); $(document).ready(function() { var statuses = new Statuses(); new NewStatusView({ el: $('#new-status'), statuses: statuses }); new StatusesView({ el: $('#statuses'), statuses: statuses }); }); 


el , Backbone this.collection . statuses collection :

тДЦ20
 var Status = Backbone.Model.extend({ url: '/status' }); var Statuses = Backbone.Collection.extend({ model: Status }); var NewStatusView = Backbone.View.extend({ - initialize: function(options) { + initialize: function() { - this.statuses = options.statuses; - - this.statuses.on('add', this.clearInput, this); + this.collection.on('add', this.clearInput, this); var add = $.proxy(this.addStatus, this); this.$('form').submit(add); }, addStatus: function(e) { e.preventDefault(); - this.statuses.add({ text: this.$('textarea').val() }); + this.collection.create({ text: this.$('textarea').val() }); }, clearInput: function() { this.$('textarea').val(''); } }); var StatusesView = Backbone.View.extend({ - initialize: function(options) { + initialize: function() { - this.statuses = options.statuses; - - this.statuses.on('add', this.appendStatus, this); + this.collection.on('add', this.appendStatus, this); }, appendStatus: function(status) { this.$('ul').append('<li>' + status.get('text') + '</li>'); } }); $(document).ready(function() { var statuses = new Statuses(); - new NewStatusView({ el: $('#new-status'), statuses: statuses }); + new NewStatusView({ el: $('#new-status'), collection: statuses }); - new StatusesView({ el: $('#statuses'), statuses: statuses }); + new StatusesView({ el: $('#statuses'), collection: statuses }); }); 



, $.proxy . Backbone . {'event selector': 'callback'} :

тДЦ21
 var Status = Backbone.Model.extend({ url: '/status' }); var Statuses = Backbone.Collection.extend({ model: Status }); var NewStatusView = Backbone.View.extend({ + events: { + 'submit form': 'addStatus' + }, + initialize: function() { this.collection.on('add', this.clearInput, this); - - var add = $.proxy(this.addStatus, this); - this.$('form').submit(add); }, addStatus: function(e) { e.preventDefault(); this.collection.create({ text: this.$('textarea').val() }); }, clearInput: function() { this.$('textarea').val(''); } }); var StatusesView = Backbone.View.extend({ initialize: function() { this.collection.on('add', this.appendStatus, this); }, appendStatus: function(status) { this.$('ul').append('<li>' + status.get('text') + '</li>'); } }); $(document).ready(function() { var statuses = new Statuses(); new NewStatusView({ el: $('#new-status'), collection: statuses }); new StatusesView({ el: $('#statuses'), collection: statuses }); }); 



рд╣рдорд╛рд░рд╛ рдЕрдВрддрд┐рдо рдХрджрдо XSS рд╣рдорд▓реЛрдВ рдХреЛ рд░реЛрдХрдирд╛ рд╣реИред Model.get ('рдЯреЗрдХреНрд╕реНрдЯ') рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдПрд╕реНрдХреЗрдк рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдпрд╣ рдореЙрдбрд▓ .рд╕реНрдХреЗрдк ('рдЯреЗрдХреНрд╕реНрдЯ') рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ ред рдпрджрд┐ рдЖрдк рд╣реИрдВрдбрд▓рдмрд╛рд░реНрд╕, рдореВрдВрдЫреЗрдВ рдпрд╛ рдЕрдиреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдмреЙрдХреНрд╕ рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

22 рдирдВрдмрд░ рдмрджрд▓реЗрдВ
  var Status = Backbone.Model.extend({ url: '/status' }); var Statuses = Backbone.Collection.extend({ model: Status }); var NewStatusView = Backbone.View.extend({ events: { "submit form": "addStatus" }, initialize: function(options) { this.collection.on("add", this.clearInput, this); }, addStatus: function(e) { e.preventDefault(); this.collection.create({ text: this.$('textarea').val() }); }, clearInput: function() { this.$('textarea').val(''); } }); var StatusesView = Backbone.View.extend({ initialize: function(options) { this.collection.on("add", this.appendStatus, this); }, appendStatus: function(status) { - this.$('ul').append('<li>' + status.get("text") + '</li>'); + this.$('ul').append('<li>' + status.escape("text") + '</li>'); } }); $(document).ready(function() { var statuses = new Statuses(); new NewStatusView({ el: $('#new-status'), collection: statuses }); new StatusesView({ el: $('#statuses'), collection: statuses }); }); 


рд╣рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ!


рдпрд╣ рдХреЛрдб рдХрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:
 var Status = Backbone.Model.extend({ url: '/status' }); var Statuses = Backbone.Collection.extend({ model: Status }); var NewStatusView = Backbone.View.extend({ events: { 'submit form': 'addStatus' }, initialize: function() { this.collection.on('add', this.clearInput, this); }, addStatus: function(e) { e.preventDefault(); this.collection.create({ text: this.$('textarea').val() }); }, clearInput: function() { this.$('textarea').val(''); } }); var StatusesView = Backbone.View.extend({ initialize: function() { this.collection.on('add', this.appendStatus, this); }, appendStatus: function(status) { this.$('ul').append('<li>' + status.escape('text') + '</li>'); } }); $(document).ready(function() { var statuses = new Statuses(); new NewStatusView({ el: $('#new-status'), collection: statuses }); new StatusesView({ el: $('#statuses'), collection: statuses }); }); 

рдпрд╣рд╛рдВ рдЖрдк рдкреБрдирд░реНрдЧрдарди рдХреЗ рдмрд╛рдж рдЖрд╡реЗрджрди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рдорд╛рди рд╣реА рджрд┐рдЦрддрд╛ рд╣реИред рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЛрдб 16 рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рдмрдврд╝рдХрд░ 40 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдмреЗрд╣рддрд░ рд╣реЛ рдЧрдпрд╛ рд╣реИ? рд╣рд╛рдВ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдо рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рдХреЛрдб рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рджреЗрдЦрд╛, рдмреИрдХрдмреЛрди рдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдХрд╛рдлреА рдорджрдж рдХреА, рдФрд░ рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдХрдо рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рдореЗрд░реЗ "рд╡реЗрдирд┐рд▓рд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдХреЛрдб рд╣реИред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП

UPD рдиреЗ рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕реНрд░реЛрдд рдХреЛ рдЫрд┐рдкрд╛ рджрд┐рдпрд╛

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


All Articles