(рдкреБрд░рд╛рд▓реЗрдЦ) рдорд╛рддреГреЗрд╢рдХрд╛.рдЬреЗрдПрд╕ - рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо

рд▓реЗрдЦ рдкреБрд░рд╛рдирд╛ рд╣реИред рдирдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЗрд╕ рдкреЛрд╕реНрдЯ рд╕реЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реИред рдХрдХреНрд╖рд╛ рджреЗрдЦреЗрдВред


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

Matryoshka рдХреЛ рдХрд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди Class рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрдорд┐рдд рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ javascript.ru рдлреЛрд░рдо ( рдбреЙрдХ рд╕реЗ рд▓рд┐рдВрдХ ) рдкрд░ рд▓рд┐рдЦрд╛ рдерд╛ ред

рддреЛ рдХрдХреНрд╖рд╛рдПрдВ рдХреНрдпреЛрдВ? рдПрдХ рд╡рд░реНрдЧ рд╕рд┐рд░реНрдл рдПрдХ рд╢рдмреНрдж рд╣реИ рдЬреЛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдкреНрд░рддрд┐рдорд╛рди рдХрд╛ рдЦрдВрдбрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЙрд╕реА рдмреИрдХрдмреЛрди.рдЬреЗрдПрд╕ рдХреЗ рдкреНрд░рд▓реЗрдЦрди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╡реЗ "рд╡рд░реНрдЧ" рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЭрд┐рдЭрдХ рдХреЗ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреЛрдИ рдХрдХреНрд╖рд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ, рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИрдВ, рдФрд░ рдореИрдВ рдЖрдкрд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рд▓реЗрдХрд┐рди, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрдпрд╛ рдпрд╣ рддрд░реНрдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ? рдЕрдЧрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдПрдХ рд╡рд░реНрдЧ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдПрдХ рд╡рд░реНрдЧ рдХреА рддрд░рд╣ рддреИрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╡рд░реНрдЧ рдХреА рддрд░рд╣ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдВрднрд╡рддрдГ рд╡рд░реНрдЧ рд╣реИ?

рдЧрд╛рдиреЗ рдХреЗ рдмреЛрд▓ рд╕реЗ рд▓реЗрдХрд░ рдПрдХреНрд╢рди рддрдХред рддреЛ, рдорд╛рддреГрдХрд╛рд╕реНрдХрд╛ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 window.MK = window.Matreshka = Class({ ... }); 

рдХрдХреНрд╖рд╛ рддрд░реНрдХ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 var MyClass = Class({ constructor: function() { ... } }); 
... рдЬреЛ рддрдм рдХреНрд▓рд╛рд╕ рдлрдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрддрд╛ рд╣реИред рдпрджрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдЦрд╛рд▓реА рдлрд╝рдВрдХреНрд╢рди рдмрди рдЬрд╛рдПрдЧрд╛ред

рдПрдХ рд╡рд░реНрдЧ рдХреЛ рджреВрд╕рд░реЗ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, MyClass рд╡рд┐рд░рд╛рд╕рдд MyClass рдорд┐рд▓рд╛ рд╣реИ):
 var MyClass = Class({ 'extends': MK }); 

( 'extends' рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рди рдХреЗрд╡рд▓ рдЙрджреНрдзрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдПрдХреНрд╕рдЯреЗрдВрдб рдПрдХ рдЖрд░рдХреНрд╖рд┐рдд рд╢рдмреНрдж рд╣реИ), рдмрд▓реНрдХрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреАред рдЕрдиреНрдп рдЧреБрдг рдмрд┐рдирд╛ рдЙрджреНрдзрд░рдг рдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред)

.initMK рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреЗ рджреМрд░рд╛рди рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд┐рдпрдо рд╣реИ: рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рд╣рдореЗрд╢рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ .initMK рд╡рд┐рдзрд┐ рдХреЛ рдЗрд╕рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЫрджреНрдо __id рдЧреБрдгреЛрдВ рдХреЛ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИ: __id (рдЖрдВрддрд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛), .__events рд╡рд╕реНрддреБ (рдШрдЯрдирд╛ рд╡рд╕реНрддреБ) рдФрд░ .__special рд╡рд╕реНрддреБред ("рд╡рд┐рд╢реЗрд╖" рдЧреБрдгреЛрдВ, рдЙрдирдХреЗ рдЕрднрд┐рдЧрдордХрд░реНрддрд╛рдУрдВ рдФрд░ рд╕рдВрдмрджреНрдз рддрддреНрд╡реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛)ред рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдирд┐рдпрдо рд╕рд╣реА рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛: MK.Array рдФрд░ MK.Object ред

рдЖрдЗрдП рдПрдХ рддреБрдЪреНрдЫ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦреЗрдВ рдЬреЛ рд▓реЙрдЧрд┐рди рдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
(рдЖрдк рддреБрд░рдВрдд рдкрд░рд┐рдгрд╛рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: jsbin.com/qohilowu/1/edit )

 <form class="login-form"> <input type="text" class="user-name" placeholder="Username"> <input type="password" class="password" placeholder="Password"> <label> <input type="checkbox" class="show-password"> Show Password </label> <input type="submit" value="Sign In" class="submit"> <label> <input type="checkbox" placeholder="Password" class="remember-me"> Remember me </label> </form> 
(рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдмреНрд▓реЙрдХреЛрдВ рдФрд░ рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬреЛ рдХреЗрд╡рд▓ рд╕реБрдЦрдж рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝реАрд▓реНрдб рд╣реИрдВ: рд▓реЙрдЧрд┐рди рдФрд░ рдкрд╛рд╕рд╡рд░реНрдбред рджреЛ рдЪреЗрдХрдмреЙрдХреНрд╕ рд╣реИрдВ: "рдкрд╛рд╕рд╡рд░реНрдб рджрд┐рдЦрд╛рдПрдВ" рдФрд░ "рдореБрдЭреЗ рдпрд╛рдж рд░рдЦреЗрдВ"ред рдПрдХ рдмрдЯрди рд╣реИ: рджрд░реНрдЬ рдХрд░реЗрдВред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд▓реЙрдЧрд┐рди рдХреА рд▓рдВрдмрд╛рдИ рдХрдо рд╕реЗ рдХрдо 4 рд╡рд░реНрдг рд╣реИ, рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреА рд▓рдВрдмрд╛рдИ рдХрдо рд╕реЗ рдХрдо 5 рд╡рд░реНрдг рд╣реЛрдиреЗ рдкрд░ рдлрд╝реЙрд░реНрдо рд╕рддреНрдпрд╛рдкрди рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдПрдХ рдХрдХреНрд╖рд╛ рдмрдирд╛рдПрдБ LoginForm ред рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ, рдореИрдВ рдирд┐рдпрдо рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реВрдВ: рдПрдХ рдЬрдЯрд┐рд▓ рддрддреНрд╡ (рдкреНрд░рдкрддреНрд░, рд╡рд┐рдЬреЗрдЯ ...) рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧред рдЕрдм рд╣рдорд╛рд░реЗ рдЫреЛрдЯреЗ рд╕реЗ рдЖрд╡реЗрджрди рдореЗрдВ LoginForm рдПрдХрдорд╛рддреНрд░ рд╡рд░реНрдЧ рд╣реЛрдЧрд╛ред
 var LoginForm = Class( ... ); 

рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдЬреЛ рд╣рдореЗрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рд╡рд╣ рдпрд╣ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдореИрддреНрд░рд┐рдпреЛрд╢реНрдХрд╛ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИ:
 var LoginForm = Class({ 'extends': MK }); 

рджреВрд╕рд░рд╛ - рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ:
 var LoginForm = Class({ 'extends': MK, constructor: function() { this.initMK(); //     ""  } }); 

рдЕрдЧрд▓рд╛, рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдЧреБрдгреЛрдВ рд╕реЗ рдмрд╛рдВрдзреЗрдВред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рд╣рдореЗрд╢рд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдореЗрдВ .bindings рд╣реВрдВ, рдЬрд┐рд╕реЗ рдореИрдВ .bindings рдХрд╣рддрд╛ .bindings ред рдпрд╣ рд╕реНрд╡рд╛рдж рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдФрд░ рдЖрдк рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЛ рдмрд╛рдВрдз рд╕рдХрддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж .initMK )ред
  ... bindings: function() { return this //      (.  (1)) // ,     ,  .innerHTML   ,       //  ,               .bindNode( this, '.login-form' ) //        (on, getValue, setValue), //       .bindNode({ userName: this.$( '.user-name' ), // ,      'keyup' password: this.$( '.password' ), // ,      'keyup' showPassword: this.$( '.show-password' ), // ,     'click' rememberMe: this.$( '.remember-me' ), // ,     'click' }) .bindNode( 'isValid', this.$( '.submit' ), { //   (.  (2)) setValue: function( v ) { $( this ).toggleClass( 'disabled', !v ); } }) ; }, ... 

(1) рд╕реНрдЯреНрд░рд┐рдВрдЧ ".bindNode( this, '.login-form' )" рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ? рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдЖрд╡реГрддреНрддрд┐ рдХреЛ .bindNode рдХреЗ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдЯреНрд░рд┐рдпреЛрд╢рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдкрддреНрддрд┐ "__this__" рдмрд╛рдВрдзрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд░рд┐рдХреЙрд░реНрдб
 this.bindNode( this, '.login-form' ); 

рдЗрд╕рдХреЗ рдмрд░рд╛рдмрд░:
 this.bindNode( '__this__', '.login-form' ); 

рд╣рдореЗрдВ "__this__" рдХреЗ рд╡рд┐рд╢реЗрд╖ рдЕрд░реНрде рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? .$ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреЛ рдЖрдкрдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рд╕реИрдВрдбрдмреЙрдХреНрд╕)ред рдпрд╣ рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд╛рдВрдЫрдиреАрдп рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде рдФрд░ .$ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдПрдХ рд╣реА рддрддреНрд╡ рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреЗ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд╕рдВрдШрд░реНрд╖реЛрдВ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд┐рдзрд┐ рдкреНрд░рд▓реЗрдЦрди .$ : Http://finom.imtqy.com/matreshka/docs/Matresh..html
(реи) рдпрд╣рд╛рдБ рд╣рдо рдЗрд╕реЗ рдмрд╛рдБрдзрддреЗ рд╣реИрдВ this.$( '.submit' ) рддрддреНрд╡ рдХреЛ 'isValid' рд╕рдВрдкрддреНрддрд┐ (рдЬрд┐рд╕реЗ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛) рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣реИ: рдпрджрд┐ isValid == false , рддреЛ рдЗрд╕ рддрддреНрд╡ рдореЗрдВ рд╡рд░реНрдЧ 'disabled' рдЬреЛрдбрд╝реЗрдВ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдирд┐рдХрд╛рд▓реЗрдВ рдпрд╣ рд╡рд░реНрдЧред
рд▓реЗрдЦрдХ рд╕реЗ рдЯрд┐рдкреНрдкрдгреА
рдпрд╣ рд▓реЗрдЦ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╡рд┐рдореЛрдЪрди рд╕реЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдиреЗ рдПрдХ рддрддреНрд╡ рдХреЛ рд╡рд░реНрдЧ рд╕реЗрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рдкреЗрд╢ рдХрд┐рдпрд╛ред рд╕рдВрд╕реНрдХрд░рдг 0.1 рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реБрдП Matryoshka рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ MK.binders.className рд╣реИ
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд▓рд┐рдВрдХ: finom.imtqy.com/matreshka/docs/Matreshka.binders.html#assassName
рдпрд╣ рдХреЛрдб:
 .bindNode( 'isValid', this.$( '.submit' ), { setValue: function( v ) { $( this ).toggleClass( 'disabled', !v ); } }) 

рдЖрдк рдЗрд╕реЗ рдЗрд╕ рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
 .bindNode( 'isValid', this.$( '.submit' ), MK.binders.className( '!disabled' ) ) 


рдХреЛрдб рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡рд┐рдзрд┐ рдХреИрд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реИред Matryoshka рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВред рдореИрдВ рдЪрд╛рдЗрдирд┐рдВрдЧ рдореЗрдердбреНрд╕ ( рдореЗрдердб рдЪрд╛рдЗрдирд┐рдВрдЧ ) рдХрд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкреНрд░рд╢рдВрд╕рдХ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд░ рд╡рд┐рдзрд┐ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд▓реМрдЯрд╛рддреА рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдмрдврд╝рд╛ рджреЗрдВрдЧреЗред .bindNode рдкрджреНрдзрддрд┐, рдХрдИ рдЕрдиреНрдп рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рддрд░рд╣ (.set, .defineGetter ...) рдмрд╕ рдпрд╣реА рдХрд░рддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдмреНрд▓реЙрдХ рдЪреЗрди рдмреНрд▓реЙрдХ рдХрд╛ рдирд┐рдпрдо рдмрдирд╛рдпрд╛:
  ( ) [].1() [].2() ... [].N()    ( ) 

рдЗрд╕рд╕реЗ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

.bindings рдХреЛ .bindings рдЬреЛрдбрд╝реЗрдВ:
  ... constructor: function() { this .initMK() .bindings() //       .initMK() ; }, ... 

рдЕрдм рд╣рдо рдШрдЯрдирд╛рдУрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдореЗрдВ .events , рдЬрд┐рд╕реЗ рдореИрдВ рдЖрдорддреМрд░ рдкрд░ .events рдХрд╣рддрд╛ .events ред
  ... events: function() { this.boundAll().on( 'submit', function( evt ) { //     (.  (1)) this.login(); evt.preventDefault(); }.bind( this ) ); //     (.  (2)) return this //      "showPassword" (.  (3)) .on( 'change:showPassword', function() { this.bound( 'password' ).type = this.showPassword ? 'text' : 'password'; }, true ) //      "userName"  "password" (.  (4)) .on( 'change:userName change:password', function() { this.isValid = this.userName.length >= 4 && this.password.length >= 5; }, true ) ; }, ... 

(1) рд╣рдореЗрдВ рдПрдХ рдлреЙрд░реНрдо рдПрд▓рд┐рдореЗрдВрдЯ рдорд┐рд▓рддрд╛ рд╣реИ ( this рдпрд╛ '__this__' ), рдпрд╛ рдЗрд╕рдХреЗ jQuery рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдФрд░ 'submit' рдИрд╡реЗрдВрдЯ рдХреЗ рд╕рд╛рде jQuery.fn.on рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред
.boundAll рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг: http://finom.imtqy.com/matreshka/docs/Matreshka.html#boundAll
(2) рдлрдВрдХреНрд╢рди.рдкреНрд░реЛрдЯрд╛рдЗрдк.рдмрд╛рдЗрдВрдб рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдмрд╛рдВрдзреЗрдВред рдпрд╣ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдШрдЯрдирд╛ рд╣реИрдВрдбрд▓рд░ (рддрддреНрд╡) рдХреЗ рдорд╛рдирдХ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдВрджрд░реНрдн рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред IE8 рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ es5-shim рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ)ред рдореБрдЭреЗ event.target , event.delegatedTarget рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрддреНрд╡ рд╕реНрд╡рдпрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдорд╛рдирдХ рд╕рдВрджрд░реНрдн рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВред

рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (рдкрд╣рд▓реЗ рд╕реЗ рд▓рд╛рдЧреВ)
Matryoshka рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдмрд╛рдЙрдВрдб рддрддреНрд╡ рдореЗрдВ DOM рдЗрд╡реЗрдВрдЯ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХрд╛ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рд╕рдВрд╕реНрдХрд░рдг 0.1 рдореЗрдВ, рдпрд╣ рд╡рд┐рдзрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рдЧреВ рд╣реИред
рд╡рд╛рдХреНрдп рд░рдЪрдирд╛:
 this.boundAll().on( 'submit', function() { ... }.bind( this ) ); 

рдпрд╛
 this.boundAll( 'key' ).on( 'click', function() { ... }.bind( this ) ); 

рдореИрдВ рдереЛрдбрд╝рд╛ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ:
 this.on( 'submit::__this__', function() { ... }); this.on( 'click::key', function() { ... }); 


(рей) рдпрд╣рд╛рдБ рдЯрд┐рдкреНрдкрдгреА рдХреЗрд╡рд▓ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд▓рд┐рдП рдмреЛрд▓рддреА рд╣реИред рдЕрдВрддрд┐рдо рддрд░реНрдХ .on рд╡рд┐рдзрд┐ ( true рд╕рд╛рде) рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдпрд╣ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИ (рдЪреВрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ boolean ), рдпрд╣ рддрд░реНрдХ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдШреЛрд╖рдгрд╛ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╣реИрдВрдбрд▓рд░ рдХреЛ рддреБрд░рдВрдд рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╛рдиреА, рдЖрдкрдХреЛ .trigger рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред

(4) "userName" рдпрд╛ "password" рдЧреБрдгреЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп, рд╣рдо рд▓реЙрдЧрд┐рди рдпрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдХреА рд▓рдВрдмрд╛рдИ рдХреА рдЬрд╛рдБрдЪ рдХрд░ 'isValid' true рдпрд╛ false 'isValid' рд╕рдВрдкрддреНрддрд┐ рдХреЛ true рдпрд╛ false рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
  ... constructor: function() { this .initMK() .bindings() .events() ; }, ... 


рдЕрдм рд╣рдо .login рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдм рддрдХ, рдХреБрдЫ рднреА рдирд╣реАрдВ рднреЗрдЬрддрд╛ рд╣реИ:
  ... login: function() { var data; if( this.isValid ) { data = { userName: this.userName, password: this.password, rememberMe: this.rememberMe }; alert( JSON.stringify( data ) ); } return this; } ... 


рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдБ:
 var loginForm = new LoginForm(); 


рдкреВрд░рд╛ рдХреЛрдб
 var LoginForm = Class({ 'extends': MK, rememberMe: true, constructor: function() { this .initMK() .bindings() .events() ; }, bindings: function() { return this .bindNode( this, '.login-form' ) .bindNode({ userName: this.$( '.user-name' ), password: this.$( '.password' ), showPassword: this.$( '.show-password' ), rememberMe: this.$( '.remember-me' ) }) .bindNode( 'isValid', this.$( '.submit' ), { setValue: function( v ) { $( this ).toggleClass( 'disabled', !v ); } }) ; }, events: function() { this.boundAll().on( 'submit', function( evt ) { this.login(); evt.preventDefault(); }.bind( this ) ); return this .on( 'change:showPassword', function() { this.bound( 'password' ).type = this.showPassword ? 'text' : 'password'; }, true ) .on( 'change:userName change:password', function() { this.isValid = this.userName.length >= 4 && this.password.length >= 5; }, true ) ; }, login: function() { var data; if( this.isValid ) { data = { userName: this.userName, password: this.password, rememberMe: this.rememberMe }; alert( JSON.stringify( data ) ); } return this; } }); var loginForm = new LoginForm(); 



рдкрд░рд┐рдгрд╛рдо: jsbin.com/qohilowu/1/edit

рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ


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

Matryoshka рдХреЗ рд╕рд╛рде, рдореЗрд░рд╛ рдХреЛрдб рдкрд░рд┐рдорд╛рдг рдХреЗ рдХрдИ рдХреНрд░рдореЛрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЕрд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд▓рдЧрднрдЧ рдЧрд╛рдпрдм рд╣реЛ рдЧрдИрдВред рдореЗрд░реЗ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХрдо рд╕рдордп рдореЗрдВ рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред

рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреБрднрд╡реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдиреЗ .login рдкрджреНрдзрддрд┐ рдореЗрдВ рдПрдХ рдмреЗрддреБрдХрд╛ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣ рджреЗрдЦрд╛ рд╣реИред
 data = { userName: this.userName, password: this.password, rememberMe: this.rememberMe }; 

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

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдЕрдЪреНрдЫрд╛ рдХреЛрдбрд┐рдВрдЧред

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


All Articles