рдФрд░ рдлрд┐рд░ рд╕реЗ рдПрдорд╡реАрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рдореБрдЭреЗ рд╡реЗрдм рдкрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдо MVC рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рд▓реЗ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

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

рдереЛрдбрд╝рд╛ рдЗрддрд┐рд╣рд╛рд╕:
MVC (рдореЙрдбрд▓ рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░) 1979 рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рднреА рд╕реНрдореЙрд▓рдЯреЙрдХ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдПред
рддрдм рд╕реЗ, рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдХреБрдЫ рднреА рдирдпрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╕реБрдзрд╛рд░, рдкреВрд░рдХ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдФрд░ рдЙрд╕ рднрд╛рд╖рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдиреБрдпрд╛рдпреА рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ HMVC (Hierarhical Model View Controller), MVP (рдореЙрдбрд▓ рд╡реНрдпреВ рдкреНрд░реЗрдЬреЗрдВрдЯрд░), MVVM (рдореЙрдбрд▓ рд╡реНрдпреВ рд╡реНрдпреВрдореЙрдбрд▓), рд▓реЗрдХрд┐рди рд╕рд╛рд░ рдПрдХ рд╣реА рд░рд╣рддрд╛ рд╣реИ - рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдФрд░ рдХрдорд╛рдВрдбрд┐рдВрдЧ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ред рдХрд╛рд░реНрдп рдФрд░ рдЙрдирдХреЗ рдХрдордЬреЛрд░ рдмрдВрдзрдиред
рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ 1979 рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рдж рд╕реЗ, рдкрд╣рд▓реА рд╕рдореАрдХреНрд╖рд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдереА: " рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдХреНрдпреЛрдВ рд╣реИ? рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред ", рджреВрд╕рд░реА рд╕рдореАрдХреНрд╖рд╛: " рдмрд╛рд╣! рд╣рд╛рдВ, рдбреЗрдЯрд╛ рдЕрднреА рдФрд░ рдореЙрдбрд▓ рдореЗрдВ рджреЗрдЦреЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реИред рд╕рдм рдХреБрдЫ рдзреАрдорд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред "рдФрд░ рдЕрдВрдд рдореЗрдВ, рддреАрд╕рд░рд╛:" рд╣рд░ рдмрд╛рд░ рдЬрдм рдореЙрдбрд▓ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рджреГрд╢реНрдп рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдм рдХреБрдЫ рдзреАрдорд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛! "ред рдЗрд╕рд▓рд┐рдП, рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рди рд╣реЛрдВ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдорд╛рди рдкреНрд░рд╢реНрди рд╣реЛрдВрдЧреЗред рд╕рдм рдХреБрдЫ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдПрдорд╡реАрд╕реА рдФрд░ рдЙрд╕рдХреЗ рдЕрдиреБрдпрд╛рдпреА рдХрд╛рдлреА рд╕рдлрд▓ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдордп-рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рд╣реИрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдк рднреА рдЗрд╕реЗ рджреЗрдЦреЗрдВрдЧреЗред

рдХрд╛рд░реНрдп : рдорд╛рдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЗрдВрдЯрд░реЗрдХреНрдЯрд┐рд╡ рдкреЗрдЬ - рдорд╛рдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдФрд░ рджреЛ рдмрдЯрди рдмрдирд╛рдПрдВред рдкрд╛рд░рдВрдкрд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ - рдПрдХ html рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВред рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдЪрдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрдЯрди рдХреЗ рдСрдирдХреНрд▓рд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╣рдо рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рдореВрд▓реНрдп рдХреЛ рдЪрдпрди рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо DOM рд╕реЗрд▓реЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ, SelectIndex рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рд▓рд┐рдП рдкреВрдЫрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВред
<html><head><script> // <![CDATA[ function addItem (value) { if (!value) { return; } var myselect = document.getElementById('myselect'); var newoption = myselect.appendChild(document.createElement('option')); newoption.value = value; newoption.innerHTML=value; } function removeCurrentItem () { var myselect = document.getElementById('myselect'); if (myselect.selectedIndex === -1) { return; } var selectedOption = myselect.options[myselect.selectedIndex]; selectedOption.parentNode.removeChild(selectedOption); } // ]]> </script> </head> <body> <select id="myselect" size="4"></select> <button onClick="addItem(prompt('enter value'))">+</button> <button onClick="removeCurrentItem()" />-</button> </body> </html> 

рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ рдФрд░ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдХреБрдЫ рдФрд░ рдХреНрдпреЛрдВ рдЪрд╛рд╣рд┐рдП? рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП, рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд▓рдЧрднрдЧ 25% рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдмрд╛рдХреА 75% рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реБрдП рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣реЗ рд╣реИрдВред рдФрд░ рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ, рдХреЛрдб рдмрдирд╛рдП рд░рдЦрдирд╛ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреАрдбрд╝реЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред

"рдореИрдВ рдЗрд╕реЗ Jquery / Dojo / MooTools / My_Love_Ajax_Library рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░реВрдВрдЧрд╛ред" рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
 <html><head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script> <script> // <![CDATA[ $(document).ready(function(){ $('#plus').bind('click', function(){ var value = prompt('add value'); if (!value) { return; } $('<option>').html(value).appendTo($('#myselect')); }); $('#minus').bind('click', function(){ var myselect = $('#myselect'); if (myselect.attr('selectedIndex') === -1) { return; } myselect.children().remove(':selected'); }); }); // ]]> </script> </head> <body> <select id="myselect" size="4"></select> <button id="plus">+</button> <button id="minus"/>-</button> </body> </html> 

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

рдХреНрд▓рд╛рд╕рд┐рдХ рдПрдорд╡реАрд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИрдВ:
  1. рдХрдордЬреЛрд░ рдмрдВрдзрди
  2. рдореЙрдбрд▓ рдХреЛ рдХрд┐рд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдкрддрд╛ рд╣реИред рдореЙрдбрд▓ рдЕрд▓рд░реНрдЯ рднреЗрдЬрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╣ рд╕реБрди рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреЗрдЦреЗрдВ, рдпрджрд┐ рд╡рд╣ рдЪрд╛рд╣рддрд╛ рд╣реИред
  3. рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдмрджрд▓ рдирд╣реАрдВ рд╕рдХрддрд╛, рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
  4. рдирд┐рдпрдВрддреНрд░рдХ рдореЙрдбрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╡реНрдпреВ (рдпрд╛ рджреГрд╢реНрдп) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ (рдЙрдиреНрд╣реЗрдВ) рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдВрддрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
  1. рдореЙрдбрд▓ рдХреЛ рдХрд┐рд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдкрддрд╛ рд╣реИред рдЕрд▓рд░реНрдЯ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ
  2. рджреЗрдЦреЗрдВ рдХреЗрд╡рд▓ рдореЙрдбрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ
  3. рдХрдВрдЯреНрд░реЛрд▓рд░ рд╡реНрдпреВ рдФрд░ рдореЙрдбрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИред

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

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

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореЙрдбрд▓ рдХреЗрд╡рд▓ рд╡рд╕реНрддреБрдУрдВ (рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдерд╛ред "рд╡рд░реНрддрдорд╛рди" рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕реАрд░рд┐рдпрд▓ рдирдВрдмрд░ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рддрд░реАрдХреЗ рднреА рд╣реИрдВ: addItem, removeCurrentItem, рдЖрдк рдЙрдирдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдореЙрдбрд▓ рдХреЛ рдЙрдирдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрд▓рд░реНрдЯ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╖рдп рдкреНрд░рдХрд╛рд░ (рдореЙрдбрд▓рдЪреЗрдВрдЬрдбреНрдпреВрдЬ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдк рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рди рдХреЗрд╡рд▓ "рдореЙрдбрд▓ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ", рдмрд▓реНрдХрд┐ "рдореЙрдбрд▓ рдХрд╛ рд╕рдВрдкрддреНрддрд┐ рдПрдХреНрд╕ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ" рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕реВрдЪрдирд╛рдПрдБ рднреЗрдЬрддреЗ рд╣реИрдВред рдпрд╣ рд╡реНрдпреВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЙрдбрд▓ рдореЗрдВ рдмрджрд▓ рдЪреБрдХреЗ рд╣реИрдВред
рдореБрдЭреЗ jquery рдореЗрдВ рд╡рд┐рд╖рдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдХрд╛рд░реНрдп рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдХрдирд╛рдбрд╛рдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ mvc рд▓реЗрдЦ рд╕реЗ рддреИрдпрд╛рд░ рдореЗрдХрдПрдмреНрд╕рд░реНрд╡реЗрдмрд▓рд╕реБрдмрд┐рдЬ рд▓рд┐рдпрд╛ред

 ... OMVC.Model = function () { var that = this; var items = []; this.modelChangedSubject = OMVC.makeObservableSubject(); this.addItem = function (value) { if (!value) { return; } items.push(value); that.modelChangedSubject.notifyObservers(); }; this.removeCurrentItem = function () { if (that.selectedIndex === -1) { return; } items.splice(that.selectedIndex, 1); that.modelChangedSubject.notifyObservers(); }; this.getItems = function () { return items; }; this.selectedIndex = -1; this.getSelectedIndex = function () { return that.selectedIndex; } this.setSelectedIndex = function (value) { that.selectedIndex = value; that.modelChangedSubject.notifyObservers(); } }; ... 


рд░рд╛рдп

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ HTML рдореЗрдВ рдПрдХ "рд░рд┐рдХреНрдд" рд╢рд░реАрд░ рд╣реИ, рд╕рднреА рддрддреНрд╡ "рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ" рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╣реИрдВ рдЕрд░реНрдерд╛рддреНред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдЬреАрдореЗрд▓ рдХреЛ рджреЗрдЦреЛ - рдпрд╣ рд╡рд╣реАрдВ рд╣реИред рд╕рднреА рддрддреНрд╡: рдмрдЯрди, рд╕реВрдЪреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╣реИрдВред
рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрджрд░реНрд╢ рд░реВрдк рдореЗрдВ, рджреГрд╢реНрдп рдХреЛ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдореЛрдб рдореЗрдВ рдореЙрдбрд▓ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рддред рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рднреА рдЖрдк рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рдЕрднреА рддрдХ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХреНрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред
 ... OMVC.View = function (model, rootObject) { var that = this; that.select = $('<select/>').appendTo(rootObject); that.select.attr('size', '4'); that.buttonAdd = $('<button>+</button>').appendTo(rootObject).height(20); that.buttonRemove = $('<button>-</button>').appendTo(rootObject).height(20); model.modelChangedSubject.addObserver(function () { var items = model.getItems(); var innerHTML = ''; for (var i = 0; i<items.length; i += 1) { innerHTML += "<option>"+items[i]+"</option>"; } that.select.html(innerHTML); }); }; ... 


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

рдЗрд╕ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ, рд╣рдо рдмрд╕ рджреГрд╢реНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВ, рдореЙрдбрд▓ рдФрд░ рджреГрд╢реНрдп рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
 ... OMVC.Controller = function (model, view) { view.buttonAdd.bind('click', function () { model.addItem(prompt('addvalue')); }); view.buttonRemove.bind('click', function () { model.removeCurrentItem(); }); view.select.bind('click', function () { model.setSelectedIndex(view.select[0].selectedIndex); }); }; ... 


рдкреВрд░реНрдг рдкреГрд╖реНрда рдХрд╛ рдкрд╛рда:
 <!doctype html> <html> <body> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script> <script> // <![CDATA[ var OMVC = {}; OMVC.makeObservableSubject = function () { var observers = []; var addObserver = function (o) { if (typeof o !== 'function') { throw new Error('observer must be a function'); } for (var i = 0, ilen = observers.length; i < ilen; i += 1) { var observer = observers[i]; if (observer === o) { throw new Error('observer already in the list'); } } observers.push(o); }; var removeObserver = function (o) { for (var i = 0, ilen = observers.length; i < ilen; i += 1) { var observer = observers[i]; if (observer === o) { observers.splice(i, 1); return; } } throw new Error('could not find observer in list of observers'); }; var notifyObservers = function (data) { // Make a copy of observer list in case the list // is mutated during the notifications. var observersSnapshot = observers.slice(0); for (var i = 0, ilen = observersSnapshot.length; i < ilen; i += 1) { observersSnapshot[i](data); } }; return { addObserver: addObserver, removeObserver: removeObserver, notifyObservers: notifyObservers, notify: notifyObservers }; }; OMVC.Model = function () { var that = this; var items = []; this.modelChangedSubject = OMVC.makeObservableSubject(); this.addItem = function (value) { if (!value) { return; } items.push(value); that.modelChangedSubject.notifyObservers(); }; this.removeCurrentItem = function () { if (that.selectedIndex === -1) { return; } items.splice(that.selectedIndex, 1); that.modelChangedSubject.notifyObservers(); }; this.getItems = function () { return items; }; this.selectedIndex = -1; this.getSelectedIndex = function () { return that.selectedIndex; } this.setSelectedIndex = function (value) { that.selectedIndex = value; that.modelChangedSubject.notifyObservers(); } }; OMVC.View = function (model, rootObject) { var that = this; that.select = $('<select/>').appendTo(rootObject); that.select.attr('size', '4'); that.buttonAdd = $('<button>+</button>').appendTo(rootObject).height(20); that.buttonRemove = $('<button>-</button>').appendTo(rootObject).height(20); model.modelChangedSubject.addObserver(function () { var items = model.getItems(); var innerHTML = ''; for (var i = 0; i<items.length; i += 1) { innerHTML += "<option>"+items[i]+"</option>"; } that.select.html(innerHTML); }); }; OMVC.Controller = function (model, view) { view.buttonAdd.bind('click', function () { model.addItem(prompt('addvalue')); }); view.buttonRemove.bind('click', function () { model.removeCurrentItem(); }); view.select.bind('click', function () { model.setSelectedIndex(view.select[0].selectedIndex); }); }; $(document).ready(function () { var model = new OMVC.Model(); var view = new OMVC.View(model, $('<div/>').appendTo($("body"))); var controller = new OMVC.Controller(model, view); }); // ]]> </script> </body> </html> 

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

рдЕрдВрдд рдореЗрдВ, рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ : рдкрд╣рд▓реЗ, рдорд╛рдирдХ рдпрд╛ рдмреЗрд╣рддрд░ jQuery-ev рдкрд░ MVC рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХреНрдпрд╛ рдлрд╛рдпрджреЗ рд╣реИрдВ? рд╣рдордиреЗ рддреАрди рдмрд╛рд░ рдЬреНрдпрд╛рджрд╛ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреЛрдб рд▓рд┐рдЦреЗ, рдФрд░ рдХрд┐рд╕ рд▓рд┐рдП?
рдЙрддреНрддрд░ : рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде, MVC рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд╛рдн рдзреАрд░реЗ-рдзреАрд░реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдиреЗ рд▓рдЧреЗ рд╣реИрдВ:
  1. рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЖрдИрдбреА рддрддреНрд╡реЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓реЗрдВред рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рддрддреНрд╡ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡реНрдпреВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ, рдЖрдкрдХреЛ HTML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
  2. рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рд░реВрдЯрдСрдмреНрдЬреЗрдХреНрдЯ рддрддреНрд╡ рдХреЗ рдЕрдВрджрд░ рдЦреАрдВрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдХрд┐рд╕реА рднреА рд░реВрдЯ рдСрдмрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдп рдХреЛ рдХрдИ рдмрд╛рд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  3. Html рдмреЙрдбреА рдореЗрдВ рдХреБрдЫ рднреА рд╕рдВрдЧреНрд░рд╣рд┐рдд рдирд╣реАрдВ рд╣реИ, рдЕрд░реНрдерд╛рдд рдмреЗрд╢рдХ рд╡рд╣рд╛рдБ рдХреБрдЫ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд▓реЗ рд░рд╣реЗ рд╣реИрдВ - рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЗрд╕реЗ рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛: html рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВред рдЕрдм рд╕рдм рдХреБрдЫ рдХреЗрд╡рд▓ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗрд╡рд▓ рд╡реНрдпреВ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  4. рдмрджрд▓рд╛рд╡ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд "рдмреЙрд╕" рдЕрдиреБрд░реЛрдз рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
    • selectIndex рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рдмрдирд╛рдПрдВ
      this.selectedIndexChangedSubject = OMVC.makeObservableSubject ();
    • рдмрджрд▓рддреЗ рд╕рдордп, рд╕реВрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ .selectedIndexChangedSubject.notifyObservers ();
    • рдФрд░ рдЬрд┐рд╕ рд░реВрдк рдореЗрдВ рд╣рдо selectIndexChangedSubject рдЕрд▓рд░реНрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ

рдмреИрдХрд▓рд╛рдЗрдЯ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг, рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг:
 <!doctype html> <html> <body> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script> <script> // <![CDATA[ var OMVC = {}; OMVC.makeObservableSubject = function () { var observers = []; var addObserver = function (o) { if (typeof o !== 'function') { throw new Error('observer must be a function'); } for (var i = 0, ilen = observers.length; i < ilen; i += 1) { var observer = observers[i]; if (observer === o) { throw new Error('observer already in the list'); } } observers.push(o); }; var removeObserver = function (o) { for (var i = 0, ilen = observers.length; i < ilen; i += 1) { var observer = observers[i]; if (observer === o) { observers.splice(i, 1); return; } } throw new Error('could not find observer in list of observers'); }; var notifyObservers = function (data) { // Make a copy of observer list in case the list // is mutated during the notifications. var observersSnapshot = observers.slice(0); for (var i = 0, ilen = observersSnapshot.length; i < ilen; i += 1) { observersSnapshot[i](data); } }; return { addObserver: addObserver, removeObserver: removeObserver, notifyObservers: notifyObservers, notify: notifyObservers }; }; OMVC.Model = function () { var that = this; var items = []; this.modelChangedSubject = OMVC.makeObservableSubject(); this.addItem = function (value) { if (!value) { return; } items.push(value); that.modelChangedSubject.notifyObservers(); }; this.removeCurrentItem = function () { if (that.selectedIndex === -1) { return; } items.splice(that.selectedIndex, 1); if (items.length === 0) { that.setSelectedIndex(-1); } that.modelChangedSubject.notifyObservers(); }; this.getItems = function () { return items; }; this.selectedIndex = -1; this.getSelectedIndex = function () { return that.selectedIndex; } this.selectedIndexChangedSubject = OMVC.makeObservableSubject(); this.setSelectedIndex = function (value) { that.selectedIndex = value; that.selectedIndexChangedSubject.notifyObservers(); } }; OMVC.View = function (model, rootObject) { var that = this; that.select = $('<select/>').appendTo(rootObject); that.select.attr('size', '4'); that.buttonAdd = $('<button>+</button>').appendTo(rootObject).height(20); that.buttonRemove = $('<button>-</button>').appendTo(rootObject).height(20).fadeOut(); model.modelChangedSubject.addObserver(function () { var items = model.getItems(); var innerHTML = ''; for (var i = 0; i<items.length; i += 1) { innerHTML += "<option>"+items[i]+"</option>"; } that.select.html(innerHTML); }); model.selectedIndexChangedSubject.addObserver(function () { if(model.getSelectedIndex() === -1) { that.buttonRemove.fadeOut(); } else { that.buttonRemove.fadeIn(); } }); }; OMVC.Controller = function (model, view) { view.buttonAdd.bind('click', function () { model.addItem(prompt('addvalue')); }); view.buttonRemove.bind('click', function () { model.removeCurrentItem(); }); view.select.bind('click', function () { model.setSelectedIndex(view.select[0].selectedIndex); }); }; $(document).ready(function () { var model = new OMVC.Model(); var view = new OMVC.View(model, $('<div/>').appendTo($("body"))); var controller = new OMVC.Controller(model, view); }); // ]]> </script> </body> </html> 

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ HTML рдкреЗрдЬ рд╣реБрдЖ рдХрд░рддрд╛ рдерд╛ - рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ HTML рдореЗрдВ рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рд╢реЗрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИред рдлрд░реНрдХ рдорд╣рд╕реВрд╕ рдХрд░реЛред

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


All Articles