рдиреЙрдХрдЖрдЙрдЯ рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг

рд╢реБрдн рджрд┐рди, рд╣рдмреНрд░реЛрд╕реИрдХреНрд╡рд┐рдЯреА! рд▓реЗрдЦ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реЗрдм рдкреЗрдЬ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред рд╕рдорд╛рдкреНрдд рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рд▓реЗрдЦ рдПрдХ рд╕рдореАрдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╢рддреНрд░реБрддрд╛ рдХреЗ рдХрд░реАрдм рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░реЗрдВред рдореИрдВрдиреЗ рдЙрдкрд░реЛрдХреНрдд рд░реВрдкрд░реЗрдЦрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЗрд╕ рдХрджрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдкрдХреНрд╖ рдкрд░ рд╕рдореГрджреНрдз рддрд░реНрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рд░-рдмрд╛рд░ рдЕрдЧрд▓реА рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджреЗрдЦрд╛ рдЧрдпрд╛:
(function($) { var initListeners = function() { /*    , , click, keypress, focus  ..*/ } var updateListeners = function() { /*   ,      */ } var createUser = function() { /*  Ajax          */ } var updateUser = function() { /*  Ajax          */ } var parseResponse = function() { /* JSON-     */ } initListeners(); })(jQuery) 
рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб 100 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреЗ рд╡рд┐рдХрд▓реНрдк рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рдХрд╛ рдХреЛрдИ рднреА рд╕рдВрд╢реЛрдзрди рдорд╣рдВрдЧрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдХреЛрдб 200 рдпрд╛ рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЛрдВ рддрдХ рдмрдврд╝рддрд╛ рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдореБрдЦреНрдп рдиреБрдХрд╕рд╛рди рд╣реИрдВ: рд░реВрдЯреАрди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ (рдШрдЯрдирд╛ рдкреНрд░рдмрдВрдзрди, JSON рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛), рдкреЗрдЬрдХрдВрдЯреНрд░реЛрд▓рд░ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рдЦрд░рд╛рдм рдФрдкрдЪрд╛рд░рд┐рдХ рд╡рд░реНрдгрди, рдФрд░ рдордЬрдмреВрдд HTML рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреАред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдХреНрд╕рд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдиреЗрд╕реНрдЯреЗрдб рдХреЙрд▓рдмреИрдХ рдХреЗ рдПрдХ mishmash рдореЗрдВ рдлрд┐рд╕рд▓ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдирдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕реНрддрд░ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рдорд╛рдпрд╛рд╡реА рддрд░реНрдХред рдХреЛрдб рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдЪреБрдирд╛рд╡ MVVM рдиреЙрдХрдЖрдЙрдЯJS рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд░ рдкрдбрд╝рд╛ рдФрд░ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рд╣рдо рд╕рдорд╕реНрдпрд╛ рдмрддрд╛рддреЗ рд╣реИрдВ

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдлрд╝реАрд▓реНрдб рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 { Id : "", Surname: "", FirstName: "", PatronymicName: "", Login: "", EMail: "" } 
рдпрд╣ рднреА рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
  1. рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реВрдЪреА рднреЗрдЬреЗрдВ
  2. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ
  3. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд░рд┐рдХреЙрд░реНрдб рдЬреЛрдбрд╝реЗрдВ / рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ
рдЗрди рд╕рднреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдПрдХ рдареВрдВрда рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 function DataGate() { var modelStub = { users: [...] }; return { Load : function(callback) { callback(modelStub); }, DeleteUser : function(callback, id) { callback(true); }, SaveOrUpdateUser : function(callback, user) { callback(user); } } } var gate = new DataGate(); 
рд╣рдо рдкреГрд╖реНрда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдореИрдВ рдкреГрд╖реНрда рддрддреНрд╡реЛрдВ рдХреЛ рдирд╛рдо рджреВрдВрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдирд╣реАрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ HTML рдХреЛрдб рдореЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕рдВрд╡рд╛рдж рдмреЙрдХреНрд╕ рдореЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕рдХреЗ рд╕рднреА рдлрд╝реАрд▓реНрдб рд╕реВрдЪреА рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдХреБрдЫ рдлрд╝реАрд▓реНрдб рд╕рдордЧреНрд░ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕реАрдзрд╛ рд╕рдВрдкрд╛рджрди рдПрдХ рд╣рд┐рдЯ рдЧреАрдд рд╣реИ, рдЬреЛ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ )ред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХ рд╕рдВрд╡рд╛рдж рдмреЙрдХреНрд╕ рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд╝реАрд▓реНрдб рдХреЗ рдкреНрд░рддреНрдпрдХреНрд╖ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рд╕реВрдЪреА рдХреЗ рдЕрдВрджрд░ рдЗрд╕рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛ред рдпрд╣ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕рдВрд╡рд╛рдж рдХреЛ рдмрдВрдж рдХрд░реЗрдВ рдФрд░ рд╕реВрдЪреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреГрд╖реНрда рдХреЗ ViewModel рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред рддрдм рд╕реВрдЪреА рдХрд╛ ViewModel, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж html рдХреЛрдб рдкрд░ рд▓рд╛рдЧреВ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрдкрд╛рджрди рдХрд╛ ViewModel рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд╕рдордп рд╕рдВрд╡рд╛рдж рдХреЗ рдореВрд▓ рднрд╛рдЧ рдкрд░ рд╕реБрдкрд░рдЗрдореНрдкреЛрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реВрдЪреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдПрдХ ViewModel рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
 var viewModel = { selectedUser : ko.observable(null), //      deleteSelectedUser : function() { /*             users */ }, createUser : function () { /*      */ } } 
рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╣рд╛рдВ рд╣реЛрдВрдЧреЗ? ViewModel рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рджреНрд╡рд╛рд░рд╛ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ JSON рд╕реНрдЯреНрд░рд┐рдВрдЧ рдпрд╛ POJI рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╕реЗ рдСрдмреНрдЬрд░реНрд╡рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдЧрд╛ ред рдпрд╣ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд╛рдзрд╛рд░рдг рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА "рдХрд╛рд╕реНрдЯрд┐рдВрдЧ" рдХреИрд╕реЗ рддрд░реАрдХреЛрдВ рдФрд░ рдСрдмреНрдЬрд░реНрд╡рд░ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде, KNockoutJS рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рдХрд╛ рдЖрдпреЛрдЬрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдбреЗрдЯрд╛рдЧреЗрдЯ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
 { users: [...] } 
рд╣рд╛рдВ, рдореИрдкрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рдж рд╡реНрдпреВрдХреЛрдб рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд╖реЗрддреНрд░ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд░рдгреА рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдмрд▓реНрдХрд┐ рдПрдХ рдСрдмреНрдЬрд░реНрд╡рд░ рд╕рд░рдгреА рд╣реЛрдЧрд╛ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдкрд┐рдВрдЧ рдХреЛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдкреВрд░рд╛ рдЧреНрд░рд╛рдлрд╝ рдСрдмреНрдЬрд░реНрд╡рд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рдорд╛рди рдЧреНрд░рд╛рдлрд╝ рдкрд░ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдРрд╕реА рдореИрдкрд┐рдВрдЧ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
  1. рдкреНрд░рддреНрдпреЗрдХ рдЧреНрд░рд╛рдлрд╝ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ
  2. рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ, рддреЛ рдЙрдирдХреЗ рдмреАрдЪ рдХреБрдВрдЬреА рдлрд╝реАрд▓реНрдб рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ
рдпрд╣ рд╕реЗрдЯрд┐рдВрдЧ рдЗрд╕ рддрд░рд╣ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:
 var mapping = { users: { key: function(data) { return ko.utils.unwrapObservable(data.Id); }, create: function(options) { return new userMapping(options.data); } } } 
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдИрдбреА рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 var userMapping = function(user) { ko.mapping.fromJS(user, {}, this); /*    user    this */ this.FIO = ko.dependentObservable(function() { return this.Surname() + " " + this.FirstName() + " " + this.PatronymicName(); }, this); /*        this  ,      user */ var _self = this; this.select = function() { viewModel.selectedUser(_self); } /*    */ this.edit = (function() { /*      */ })(); /*    ,              */ } 
рдкреГрд╖реНрда рдкрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдб рдХрд░реЗрдВ:
 $(function() { gate.Load(function(loadedModel) { ko.mapping.fromJS(loadedModel, mapping, viewModel); ko.applyBindings(viewModel); }); }); 

HTML рдХреЛрдб

рд╕рднреА рдХреЛрдб <body> рдЯреИрдЧ рдХреЗ рдЕрдВрджрд░ рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗ:
 <h2> </h2> <div data-bind="jqueryui : 'buttonset'"> <button data-bind="click: createUser"></button> <button data-bind="click: deleteSelectedUser, enable: selectedUser() !== null"></button> </div> <div id="UserListTable"> <div> <table class="list"> <thead> <tr> <th></th> <th></th> </tr> </thead> <tbody data-bind="template: {name: 'editUsersRow', foreach: users, templateOptions: { current: selectedUser } }"> </tbody> </table> </div> </div> <script type="text/html" id="editUsersRow"> <tr data-bind="attr: { 'data-id': Id }, click: select, css: { selected: $data == $item.current() }"> <td><a href="#" data-bind="text: FIO, click: edit"></a></td> <td data-bind="text: Login"></td> </tr> </script> 
рдХреЛрдб рдкрд░ рдХреБрдЫ рдиреЛрдЯ:рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдиреНрдпреВрдирддрдо рд╣реИ, HTML рдХреЛрдб рдХреЙрдореНрдкреИрдХреНрдЯ, рдЧрддрд┐рд╢реАрд▓ рдФрд░ рдкрддрд▓рд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рдбрд╛рдпрдирд╛рдорд┐рдХ рдПрдбрд┐рдЯ / рдбрд┐рд▓реАрдЯ / рдЗрдВрд╕рд░реНрдЯ рдЯреЗрдмрд▓ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛ-рдкреНрд▓рдЧрд┐рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рдорд╛рди рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рд╕рдВрд╡рд╛рдж рдмрдирд╛рдПрдБ / рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкрд░реНрдпрд╛рдкреНрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП, рд╕рдВрд╡рд╛рдж рдХреЗ рдПрдХ рдЕрд▓рдЧ ViewModel рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдЕрдзрд┐рдорд╛рдирддрдГ рдмрдирд╛рдиреЗ рдФрд░ рд╕рдВрдкрд╛рджрди рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ)ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рдВрдкрд╛рджрди рд╕рдВрд╡рд╛рдж рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
  1. рдЪрдпрдирд┐рдд рдПрдХ рд╕реЗ POJO рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдпрд╣ рдСрдкрд░реЗрд╢рди рдореИрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдпрд╛ рдПрдХ рдЦрд╛рд▓реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ POJO рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ (рдпрджрд┐ рдЖрдкрдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдирдпрд╛ рдмрдирд╛рдПрдВ)
  2. рд╕рдВрд╡рд╛рдж рдмреЙрдбреА рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ HTML рдХреЛрдб рдмрдирд╛рдПрдБред
  3. рдирд┐рд░реНрдорд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд░ jQuery рдпреВрдЖрдИ рд╕рдВрд╡рд╛рдж рдУрд╡рд░рд▓реЗред
  4. рдпрджрд┐ рд╕рдВрд╡рд╛рдж рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ ViewModel рдХреЛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рдореВрд▓ рддрддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рдпрд▓ рдХрд░реЗрдВред
рдХреЛрдб рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╕рдорд╛рдзрд╛рди:
 function buildEditUserDlg(model, closeCallback){ return $("#editUserDlg").tmpl().dialog({ title: model.FIO()+" ", /*        ,        . */ width: 400, create: function(e) { var _self = this; ko.applyBindings(model, e.target); /*   ViewModel   */ model.FIO.subscribe(function(newValue) { /*       */ $(_self).dialog("option", "title", newValue+" "); }); model.isOperationComplete.subscribe(function(newValue){ /*   ViewModel   ,    ,           */ if (newValue === true) $(_self).dialog("close"); }) }, close: function(e) { /*     ,   . */ $(this).dialog("destroy").remove(); closeCallback(); }, buttons: { "" : function() { model.save(); }, "": function() { $(this).dialog("close"); } } }); } 
рдпрд╣ рд╕рдВрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╕рдВрд╡рд╛рдж рдХреЗ рд╢реБрд░реБрдЖрддреА рдХреЛрдб рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ (рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ)ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореИрдкрд┐рдВрдЧ рдХреЛрдб рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ:
 this.edit = (function() { var currentDialog = null; return function() { if (currentDialog != null) { return; } var dialogModel = new userEditDialogMapping(ko.mapping.toJS(_self)); currentDialog = buildEditUserDlg(dialogModel, function() {currentDialog = null}); }; })(); 
рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд╕рдВрд╡рд╛рдж рдХреНрд▓реЛрдЬрд░ рдХреЙрд▓рдмреИрдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдЙрдкрд╛рдп рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред

HTML рдХреЛрдб

 <script type="text/html" id="editUserDlg"> <div> <table> <tbody> <tr> <th><label for="surname">:</label></th> <td><input maxlength="20" name="surname" data-bind="value: Surname" type="text" value=""></td> </tr> <tr> <th class="property"><label for="firstname">:</label></th> <td><input maxlength="20" data-bind="value: FirstName" name="firstname" type="text"></td> </tr> <tr> <th class="property"><label for="patronymicname">:</label></th> <td><input maxlength="20" name="patronymicname" data-bind="value: PatronymicName" type="text" value=""></td> </tr> <tr> <th class="property"><label for="email">E-Mail:</label></th> <td><input maxlength="30" name="email" data-bind="value: EMail" type="text" value=""></td> </tr> <tr> <th class="property"><label for="login">:</label></th> <td><input maxlength="20" name="login" data-bind="value: Login" type="text" value=""></td> </tr> </tbody> </table> </div> </script> 
рд╡рд╣ рд╕рдм рд╣реИред рдЧреНрд░рд╛рд╣рдХ рдЖрд╡реЗрджрди рддреИрдпрд╛рд░ рд╣реИ! PSред HTML рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ?


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


All Articles