Ember.js: [рдХреНрд╡реЗрд╕реНрдЯ] рдПрдореНрдмрд░ рдореЗрдВ рдЭрд┐рд▓рдорд┐рд▓рд╛рддреЗ рдЕрд╡рдпрд╡

рдХреЛ рдирд┐рд░реНрдорд┐рдд 28 рдлрд╝рд░ре░ 2018  ┬╖  23рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: emberjs/ember.js

рдпрд╣ рдЦреЛрдЬ рд╕рдорд╕реНрдпрд╛ Ember.js рдореЗрдВ рдЧреНрд▓рд┐рдорд░ рдШрдЯрдХреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддреА рд╣реИред

рдпреЛрдЬрдирд╛

Glimmer.js рдШрдЯрдХреЛрдВ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ:

  1. "рдмрд╛рд╣рд░реА HTML" рдЯреЗрдореНрдкреНрд▓реЗрдЯ (рдХреЛрдИ tagName , attributeBindings , рдЖрджрд┐)
  2. рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рддрд░реНрдХ @ рдкрд╣рд▓реЗ рд╕реЗ рд▓рдЧреЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ {{@firstName}}
  3. рдШрдЯрдХ рдкрд░ рддрд░реНрдХ this.args рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ
  4. рдШрдЯрдХ рд╡рд░реНрдЧ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
  5. рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдШрдЯрдХ рд╕реНрдерд┐рддрд┐ @tracked рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдиреЛрдЯреЗрдЯ рдХреА рдЧрдИ рд╣реИ
  6. рдШрдЯрдХреЛрдВ рдХреЛ <AngleBracket /> рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  7. рдЧреБрдгреЛрдВ рдХреЛ тАжattributes рдорд╛рдзреНрдпрдо рд╕реЗ "рд╡рд┐рднрд╛рдЬрд┐рдд" рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

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

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдПрдореНрдмрд░ рдореЗрдВ рдЧреНрд▓рд┐рдорд░ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдбрд╝рдХ рд╢реБрд░реВ рдХрд░ рджреА рд╣реИред рдкрд╣рд▓реА рджреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдкрд╣рд▓реЗ рд╣реА рдЙрддрд░рдирд╛ рд╢реБрд░реВ рд╣реЛ рдЪреБрдХреА рд╣реИрдВ:

  1. рдХреЗрд╡рд▓-рдЯреЗрдореНрдкрд▓реЗрдЯ рдШрдЯрдХреЛрдВ рдореЗрдВ, рдЯреЗрдореНрдкреНрд▓реЗрдЯ "рдмрд╛рд╣рд░реА HTML" рд╣реЛрддреЗ рд╣реИрдВ ( template-only-glimmer-components рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред)
  2. рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ @ рдЙрдкрд╕рд░реНрдЧ (рдЬреИрд╕реЗ {{@firstName}} ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддрд░реНрдХреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдореБрджреНрджрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдШрдЯрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдбреЙрдиреНрд╕ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдХрд░ рдЧреНрд▓рд┐рдорд░ рдШрдЯрдХреЛрдВ рдХреЛ рдПрдореНрдмрд░ рдореЗрдВ рд▓рд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ @glimmer/component рдкреИрдХреЗрдЬ рдХреЛ рдПрдореНрдмрд░ рдПрдбрдСрди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЧреНрд▓рд┐рдорд░.рдЬреЗрдПрд╕ рдШрдЯрдХ рдПрдкреАрдЖрдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рд╣рдо рдЙрд╕ рдХрд╛рдо рдХреЛ рдЪрд░рдгреЛрдВ рдореЗрдВ рддреЛрдбрд╝ рджреЗрдВрдЧреЗ, рд╣рд░ рдПрдХ рдореМрдЬреВрджрд╛ рдПрдореНрдмрд░ рдРрдкреНрд╕ рдФрд░ рдПрдбрдСрди рдХреЗ рд▓рд┐рдП рд▓рд╛рдн рдЕрдирд▓реЙрдХ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЪрд░рдг 0 рд╡реИрдХрд▓реНрдкрд┐рдХ рдШрдЯрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЖрджрд┐рдо рдХреЛ Ember.js рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдЪрд░рдг 1, 2 рдФрд░ 3 Glimmer.js рдШрдЯрдХ API рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдВред

рдЬрдмрдХрд┐ рд╣рдо рдЪрд░рдг 0 рдФрд░ 1 рдХреА рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рд╣рдо рдмрд╛рдж рдХреЗ рдЪрд░рдгреЛрдВ рдХреЗ рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдгреЛрдВ рдХреА рдЦреЛрдЬ рдХреЛ рддрдм рддрдХ рдХреЗ рд▓рд┐рдП рдЯрд╛рд▓ рджреЗрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рдкрд╣рд▓реЗ рдЪрд░рдг рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдХрд░реАрдм рди рд╣реЛрдВред

рдЪрд░рдг 0: рдШрдЯрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛

TL; DR: Addons рдХреЛ рдХрд╕реНрдЯрдо рдХрдВрдкреЛрдиреЗрдВрдЯ API рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП Ember.js рдореЗрдВ CustomComponentManager API рдЬреЛрдбрд╝реЗрдВред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдПрдореНрдмрд░ рдРрдк рдХреЗ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЛ Ember.Component рдЙрдкрд╡рд░реНрдЧ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдореНрдмрд░ рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рдШрдЯрдХ рдПрдкреАрдЖрдИ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдореНрдмрд░ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдШрдЯрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрдм рдФрд░ рдХреИрд╕реЗ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрдм рд╣рдо "рдХрд╕реНрдЯрдо рдШрдЯрдХ рд╡реНрдпрд╡рд╣рд╛рд░" рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░рд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорддрд▓рдм рд╣реЛрддрд╛ рд╣реИ:

  1. рдШрдЯрдХ рдЙрджрд╛рд╣рд░рдг рдХреИрд╕реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
  2. рдШрдЯрдХ рдЙрджрд╛рд╣рд░рдг рдХреИрд╕реЗ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
  3. рдШрдЯрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХреИрд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
  4. рдЗрди рдЬреАрд╡рдирдЪрдХреНрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдШрдЯрдХ рдХреЛ рдХреИрд╕реЗ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо CustomComponentManager рдирд╛рдордХ рдПрдХ рдирдпрд╛ рдПрдореНрдмрд░ рдПрдкреАрдЖрдИ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред CustomComponentManager рдкреВрд░реНрдг рд╡рд┐рдХрд╕рд┐рдд ComponentManager рдЧреНрд▓рд┐рдорд░ рд╡реАрдПрдо рдПрдкреАрдЖрдИ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдПрдкреАрдЖрдИ рд╕рддрд╣ рдХреНрд╖реЗрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдбрдСрди рд▓реЗрдЦрдХреЛрдВ рдХреЛ "рд╕рдлрд▓рддрд╛ рдХреЗ рдЧрдбреНрдвреЗ" рдореЗрдВ рдЧрд┐рд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

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

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

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

рдХрд╕реНрдЯрдо рдШрдЯрдХ рдкреНрд░рдмрдВрдзрдХ рдбрд┐рд╕реНрдХрд╡рд░реА

рдЗрд╕ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ, рдШрдЯрдХреЛрдВ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдШрдЯрдХ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдСрдкреНрдЯ-рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╡реЗ рдПрдореНрдмрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдПрдХ рд╡рд┐рд╢реЗрд╖ componentManager рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдПрдиреЛрдЯреЗрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдШрдЯрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рдШрдЯрдХ рдкреНрд░рдмрдВрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

import { componentManager } from '@ember/custom-component-manager';
import EmberObject from '@ember/object';

export default componentManager(EmberObject.extend({
  // ...
}), 'glimmer');

рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рдХреНрд▓рд╛рд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдмрди рд╕рдХрддрд╛ рд╣реИ:

import { componentManager } from '@ember/custom-component-manager';

export default @componentManager('glimmer') class {
  // ...
}

рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕ рдШрдЯрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдореНрдмрд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдореЗрдВ рдПрдХ рдХрд╕реНрдЯрдо рдШрдЯрдХ рдкреНрд░рдмрдВрдзрдХ рдПрдиреЛрдЯреЗрд╢рди рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрдВрдЯреЗрдирд░ рдкрд░ рд▓реБрдХрдЕрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдореНрдмрд░ рдХрдВрдЯреЗрдирд░ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдХрдВрдЯреЗрдирд░ рд╕реЗ рдкреВрдЫреЗрдЧрд╛ component-manager:glimmer ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░ Addons рдХрд╕реНрдЯрдо рдШрдЯрдХ рдкреНрд░рдмрдВрдзрдХ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдорд╛рд░рд╛ рдЧреНрд▓рд┐рдорд░ рдХрдВрдкреЛрдиреЗрдВрдЯ рдПрдбрдСрди addon/component-managers/glimmer.js рд╕реЗ рдПрдХ рдХрдВрдкреЛрдиреЗрдВрдЯ рдореИрдиреЗрдЬрд░ рдХреЛ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдирд┐рдпрдореЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЦреЛрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред

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

// addon/index.js
import EmberObject from '@ember/object';
import { componentManager } from '@ember/custom-component-manager';

export default componentManager(EmberObject.extend({
  // ...
}), 'turbo');

рдЗрд╕ рдРрдбрдСрди рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╣реА рдШрдЯрдХ рдкреНрд░рдмрдВрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдШрдЯрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП TurboComponent рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреЛ рдЙрдкрд╡рд░реНрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

import TurboComponent from 'turbo-component';

export default TurboComponent.extend({
  didInsertElementQuickly() {
    // ...
  }
});

рдХрд╕реНрдЯрдо рдШрдЯрдХ API

рдХреЛрдИ рднреА рдШрдЯрдХ рджреНрд╡реАрдк рдирд╣реАрдВ рд╣реИ, рдФрд░ рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдирдП рдШрдЯрдХ API рдХреА рд╢реБрд░реВрдЖрдд рдореМрдЬреВрджрд╛ рдШрдЯрдХреЛрдВ рдХреЛ рднрдВрдЧ рди рдХрд░реЗред

рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореМрдЬреВрджрд╛ рджреГрд╢реНрдп рдкрджрд╛рдиреБрдХреНрд░рдо API рд╣реИред рдПрдореНрдмрд░ рдШрдЯрдХ parentView рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рдореВрд▓ рдШрдЯрдХ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ Ember.Component , рддреЛ рдмрдЪреНрдЪреЗ рдХреЗ рдПрдореНрдмрд░ рдШрдЯрдХреЛрдВ рдореЗрдВ рдЕрднреА рднреА рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп parentView рд╕рдВрдкрддреНрддрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдПрдореНрдмрд░ рдореЗрдВ CurlyComponentManager рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рд╕рд╛рде рд╣реА рдЕрдиреНрдп рдкрд░рд┐рд╡реЗрд╢ "рд╕реНрдХреЛрдк рд╕реНрдЯреЗрдЯ" рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд▓рдХреНрд╖реНрдпред

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

import CustomComponentManager from "@ember/custom-component-manager";

export default new CustomComponentManager({
  // major and minor Ember version this manager targets
  version: "3.1",
  create({ ComponentClass, args }) {
    // Responsible for instantiating the component class and passing provided
    // component arguments.
    // The value returned here is passed as `component` in the below hooks.
  },
  getContext(component) {
    // Returns the object that serves as the root scope of the component template.
    // Most implementations should return `component`, so the component's properties
    // are looked up in curly expressions.
  },
  update(component, args) {
    // Called whenever the arguments to a component change.
  },
  destroy(component) {
  }
});

рдЪрд░рдг 1: рдПрдореНрдмрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЧреНрд▓рд┐рдорд░ рдШрдЯрдХ

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

рдкрд╣рд▓реЗ рдЪрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо @glimmer/component рдкреИрдХреЗрдЬ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░рд▓реАрдХреГрдд Glimmer.js рдШрдЯрдХ API рдореЗрдВ рдСрдкреНрдЯ рдЗрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЧреНрд▓рд┐рдорд░ Component рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗ рдЬреЛ Ember.Object рд╕реЗ @glimmer/component/compat рдкрд░ рдЗрдирд╣реЗрд░рд┐рдЯ рд╣реЛрддрд╛ рд╣реИред

"рдПрдореНрдмрд░-рдЧреНрд▓рд┐рдорд░ рдШрдЯрдХ" рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

// src/ui/components/user-profile/component.js
import Component from '@glimmer/component/compat';
import { computed } from '@ember/object';

export default Component({
  fullName: computed('args.firstName', 'args.lastName', function() {
    let { firstName, lastName } = this.args
    return `${firstName} ${lastName}`;
  })

  isAdmin: false,

  toggleAdmin() {
    this.set('isAdmin', !this.isAdmin);
  }
});
{{!-- src/ui/components/user-profile/template.hbs --}}
<h1>{{fullName}}</h1>
<p>
  Welcome back, {{@firstName}}!
  {{#if isAdmin}}
    <strong>You are an admin.</strong>
  {{/if}}
</p>
<button {{action toggleAdmin}}>Toggle Admin Status</button>

рдЗрди рдШрдЯрдХреЛрдВ рдХреА рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:

  • рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдмрд╛рд╣рд░реА HTML рд╣реИрдВ ред рдЪреВрдВрдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдПрдХ рднреА рдореВрд▓ рддрддреНрд╡ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ "рдЯреИрдЧ рд░рд╣рд┐рдд рдШрдЯрдХ" рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рд╣реЛрддрд╛ рд╣реИред
  • рдХреНрд░рд┐рдпрд╛рдПрдВ рдШрдЯрдХ рдкрд░ actions рд╣реИрд╢ рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
  • рдШрдЯрдХ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧреБрдгреЛрдВ рдХреЛ рд╕реАрдзреЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп args рд╕рдВрдкрддреНрддрд┐ рдкрд░ рддрд░реНрдХ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
  • рд╡реЗ рдПрдореНрдмрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдЧреБрдг рдФрд░ рдорд┐рд╢реНрд░рдг рдЬреИрд╕реЗ рдЙрдкрдХрд░рдг рдЬреЛ рдПрдореНрдмрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред

рдЙрддрдирд╛ рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬреЛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ :

  • рдЪрд░рдг 3 рддрдХ @tracked рдЧреБрдг рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред
  • рдШрдЯрдХ рдкрд░ рдХреЛрдИ layout рдпрд╛ template рдЧреБрдг рдирд╣реАрдВ рд╣реИрдВред
  • рджреГрд╢реНрдп рдкрджрд╛рдиреБрдХреНрд░рдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдИ рд╡рд┐рдзрд┐ рдпрд╛ рдЧреБрдг рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕реЗ childViews , parentView , nearestWithProperty , рдЖрджрд┐ред
  • рдореВрд▓ рддрддреНрд╡ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ tagName , attributeBindings , рдпрд╛ рдЕрдиреНрдп рдХрд╕реНрдЯрдо JavaScript DSL рдирд╣реАрдВред
  • рдИрд╡реЗрдВрдЯ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ send рдпрд╛ sendAction ред
  • рдХреЛрдИ рдЕрдирд┐рд╡рд╛рд░реНрдп ember-view рдХреНрд▓рд╛рд╕ рдпрд╛ рдСрдЯреЛ-рдЬреЗрдирд░реЗрдЯреЗрдб рдЧрд╛рдЗрдб рдПрд▓рд┐рдореЗрдВрдЯ рдЖрдИрдбреА рдирд╣реАрдВред
  • рдХреЛрдИ рдореИрдиреНрдпреБрдЕрд▓ rerender() рд╡рд┐рдзрд┐ рдирд╣реАрдВред
  • рдХреЛрдИ attrs рд╕рдВрдкрддреНрддрд┐ рдирд╣реАрдВ (рдЗрд╕рдХреЗ рдмрдЬрд╛рдп args рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)ред
  • рдкрд╛рд░рд┐рдд рддрд░реНрдХ "рдпреВрдирд┐рдбрд╛рдпрд░реЗрдХреНрд╢рдирд▓" рд╣реИрдВ рдФрд░ рджреЛ-рддрд░рдлрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВред
  • рд╣рд╛рд░реНрдб-рдЯреВ-рдбреАрдмрдЧ рдирд╛рдордХрд░рдг рдЯрдХрд░рд╛рд╡ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╛рд░рд┐рдд рддрд░реНрдХреЛрдВ рдХреЛ рдШрдЯрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЧреБрдгреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдШрдЯрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП jQuery рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ this.$() ред
  • DOM рдореЗрдВ рдХреЛрдИ рдореИрдиреНрдпреБрдЕрд▓ appendTo рдШрдЯрдХреЛрдВ рдХрд╛ рдирд╣реАрдВред
  • рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреАрд╡рдирдЪрдХреНрд░ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ:

    • willInsertElement

    • didRender

    • willRender

    • willClearRender

    • willUpdate

    • didReceiveAttrs

    • didUpdateAttrs

    • parentViewDidChange

  • рдШрдЯрдХ рдЬреАрд╡рдирдЪрдХреНрд░ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ on() рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рдирд╣реАрдВ; рд╣реБрдХ рдХреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдЗрд╕ рд╕реЗрдЯ рдХрд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ ES Classes RFC рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рд╛рде, рд╣рдо рдЙрдкрд░реЛрдХреНрдд рдШрдЯрдХ рдХрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

// src/ui/components/user-profile/component.js
import Component from '@glimmer/component/compat';
import { computed } from 'ember-decorators/object';

export default class extends Component {
  isAdmin = false;

  @computed('args.firstName', 'args.lastName')
  get fullName() {
    let { firstName, lastName } = this.args;
    return `${firstName} ${lastName}`;
  })

  toggleAdmin() {
    this.set('isAdmin', !this.isAdmin);
  }
});

рдЪрд░рдг 2 - рдХреЛрдг рдмреНрд░реИрдХреЗрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕

рдЪрд░рдг 2 рдХрд░реНрд▓реА ( {{my-component user=currentUser}} ) рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдг рдХреЛрд╖реНрдардХ ( <UserAvatar @user={{currentUser}} /> ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдШрдЯрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдШрдЯрдХ рддрд░реНрдХреЛрдВ рдФрд░ HTML рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ тАжattributes рдорд╛рдзреНрдпрдо рд╕реЗ рдШрдЯрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ "рд╕реНрдкреНрд▓реИрдЯрд┐рдВрдЧ" рдкрд╛рд░рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рднреА рд╕рдХреНрд╖рдо рдмрдирд╛рддреА рд╣реИред

{{! src/ui/components/UserAvatar/template.hbs }}
<div ...attributes> {{! <-- attributes will be inserted here }}
  <h1>Hello, {{@firstName}}!</h1>
</div>
<UserAvatar @user={{currentUser}} aria-expanded={{isExpanded}} />

рдпрд╣ рдирд┐рдореНрди рдХреЗ рд╕рдорд╛рди рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛:

<div aria-expanded="true">
  <h1>Hello, Steven!</h1>
</div>

рдЪрд░рдг 3 - рдЯреНрд░реИрдХ рдХрд┐рдП рдЧрдП рдЧреБрдг

рдЪрд░рдг 3 рдПрдореНрдмрд░ рдореЗрдВ @tracked рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯреНрд░реИрдХ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред рдПрдореНрдмрд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ рдФрд░ рдЯреНрд░реИрдХ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдЗрдВрдЯрд░рдСрдк рдХреЗ рд╡рд┐рд╡рд░рдг рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ @glimmer/component/compat рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп, рдЧреИрд░-Ember.Object рдШрдЯрдХ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред

рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдорд░реНрдЬ рдХреА рдЧрдИ "рдСрдЯреЛрдЯреНрд░реИрдХ" рд╕реБрд╡рд┐рдзрд╛ (рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреА рд╣реИ) рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░, рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдХрд╛ рдФрд░ рд╕рд░рд▓реАрдХрд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

import Component, { tracked } from '@glimmer/component';

export default class extends Component {
  <strong i="24">@tracked</strong> isAdmin = false;

  <strong i="25">@tracked</strong> get fullName() {
    let { firstName, lastName } = this.args;
    return `${firstName} ${lastName}`;
  }

  toggleAdmin() {
    this.isAdmin = !this.isAdmin;
  }
}

рдкреНрд░рд╢реНрдиреЛрддреНрддрд░:

рдХреНрдпрд╛ рдореИрдВ рдореМрдЬреВрджрд╛ рд╕реАрдПрд╕рдПрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЧреНрд▓рд┐рдорд░ рдШрдЯрдХреЛрдВ рдореЗрдВ ember-view рд╡рд░реНрдЧ рдирд╛рдо рдпрд╛ рдСрдЯреЛ-рдЬреЗрдирд░реЗрдЯреЗрдб id рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рд╡рд╛рдкрд╕ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ?

рд╣рд╛рдВред рдЙрджрд╛рд╣рд░рдг:

<div class="ember-view" id="{{uniqueId}}">
  Component content goes here.
</div>
import Component from '@glimmer/component';
import { guidFor } from '@ember/object/internals';

export default class extends Component {
  get uniqueId() {
    return guidFor(this);
  }
}

рд╕рд╛рдзрди

рдХрд╛рд░реНрдп

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

рдХрд╕реНрдЯрдо рдШрдЯрдХ рдкреНрд░рдмрдВрдзрдХ API

  • [x] рдЙрдкрд░реЛрдХреНрдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдШрдЯрдХ RFC рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ (@chancancode)
  • [x] glimmer-custom-component-manager рдлреАрдЪрд░ рдлреНрд▓реИрдЧ рдЬреЛрдбрд╝реЗрдВ
  • [x] componentManager рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░реЗрдВ

    • [x] { componentManager } from '@ember/custom-component-manager' рд░реВрдк рдореЗрдВ рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд░реЗрдВ

  • [x] рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ
  • [x] рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдШрдЯрдХ рдкреНрд░рдмрдВрдзрдХ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

    • [ ] рдПрдбрдСрди рд▓реЗрдЦрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХрд┐ рдШрдЯрдХ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреЛ рдХрд╣рд╛рдВ рд░рдЦрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЦреЛрдЬрд╛ рдЬрд╛ рд╕рдХреЗ

    • [ ] рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдПрдХреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? (@рдорд┐рдХреНрд╕реЛрдирд┐рдХ)

  • [x] CustomComponentManager рдПрдкреАрдЖрдИ рд▓рд╛рдЧреВ рдХрд░реЗрдВ

    • [x] CustomComponentManagerDelegate рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ

    • [рдПрдХреНрд╕] version

    • [рдПрдХреНрд╕] create()

    • [рдПрдХреНрд╕] getContext()

    • [рдПрдХреНрд╕] update()

    • [рдПрдХреНрд╕] destroy?()

    • [рдПрдХреНрд╕] didCreate?()

    • [рдПрдХреНрд╕] didUpdate?()

    • [рдПрдХреНрд╕] getView?()

    • [x] рдирд┐рд░реНрдорд╛рдг рдкрд░ version рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдорд╛рдиреНрдп рдХрд░реЗрдВ

    • [x] рдЖрдВрддрд░рд┐рдХ

    • [x] рдореМрдЬреВрджрд╛ рдШрдЯрдХреЛрдВ рдореЗрдВ childViews рдФрд░ parentView рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦреЗрдВ

    • [ ] рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг

    • [] рдПрдореНрдмрд░ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рдзрди

рдЧреНрд▓рд┐рдорд░ рдХрдВрдкреЛрдиреЗрдВрдЯ рдПрдбрдСрди

  • [x] sparkles-components рдПрдбрдСрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд░реНрдерди

    • [x] рдПрдореНрдмрд░ . рд╕реЗ рдЦрдкрдд рд╣реЛрдиреЗ рдкрд░ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЛ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ componentManager рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП

    • [x] CustomComponentManager рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдореНрдмрд░ рдХреЗ рдХрдВрдЯреЗрдирд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрдЬрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

  • [ ] рдПрдореНрдмрд░ рдПрдбрдСрди рдХреЗ рд░реВрдк рдореЗрдВ @glimmer/component рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд░реНрдерди рдХрд░реЗрдВ

    • [ ] Glimmer.js . рд╕реЗ рдЙрдкрднреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдореМрдЬреВрджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦреЗрдВ

    • [ ] import Component from '@glimmer/component' рд╕рд╛рджрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ

    • [ ] import Component from '@glimmer/component/compat' Ember.Object рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ

      рдЦреЛрдЬреЗрдВ

  • [] рдЬреАрд╡рдирдЪрдХреНрд░ рд╣реБрдХ

    • [x] рд╕реНрдерд┐рд░ create(injections)

    • [рдПрдХреНрд╕] didInsertElement()

    • [рдПрдХреНрд╕] willDestroy()

    • [рдПрдХреНрд╕] didUpdate()

    • [x] рдЗрд╡реЗрдВрдЯ рдбреЗрд▓рд┐рдЧреЗрд╢рди-рдЖрд╣реНрд╡рд╛рди рд╡рд┐рдзрд┐рдпреЛрдВ ( click() рдЖрджрд┐) рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

  • [ ] рдПрд▓рд┐рдореЗрдВрдЯ рдПрдХреНрд╕реЗрд╕

    • [ ] this.bounds

    • [ ] this.element рдкрд░рд┐рдХрд▓рд┐рдд рд╕рдВрдкрддреНрддрд┐ рдЙрдкрдирд╛рдо this.bounds

    • [] рддрддреНрд╡реЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрддреНрд╡ рд╕рдВрд╢реЛрдзрдХ-рдЖрдзрд╛рд░рд┐рдд рдПрдкреАрдЖрдИ

  • [ ] рддрд░реНрдХ

    • [x] this.args рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ

    • [x] this.args рдХреЛ didUpdate рдХрд╣реЗ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

    • [ ] this.args рдПрдХ рдЕрдирдВрдд рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдЪрдХреНрд░ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)

  • [ ] рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг

    • [ ] рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ

    • [ ] рдЪреЗрддрд╛рд╡рдиреА

    • [ ] рдХреИрдирд░реА-рдУрдирд▓реА

    • [] рдкреНрд░реА-1.0

    • [ ] рдПрдореНрдмрд░-рдЧреНрд▓рд┐рдорд░ "рдХреЙрдореНрдкреЗрдЯ" рдШрдЯрдХ

    • [ ] рдмрд╛рд╣рд░реА HTML рдЯреЗрдореНрдкреНрд▓реЗрдЯ

    • [] рдЬреАрд╡рдирдЪрдХреНрд░ рд╣реБрдХ

    • [ ] рдкрд░рд┐рдХрд▓рд┐рдд рдЧреБрдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛



      • [ ] args рдкрд░ рдХреИрд╕реЗ рдирд┐рд░реНрднрд░ рд░рд╣реЗрдВ



    • [ ] рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЧрд╛рдЗрдб / рдЧреНрд▓рд┐рдорд░ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдПтАж

    • рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рднрд╛рд╡реА рдЧреНрд▓рд┐рдорд░ рдШрдЯрдХреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛

    • [ ] рдПрдореНрдмрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЧреНрд▓рд┐рдорд░ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕

    • [ ] рд░рд┐рдПрдХреНрдЯ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЧреНрд▓рд┐рдорд░ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕

    • [ ] рдХреЛрдгреАрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЧреНрд▓рд┐рдорд░ рдШрдЯрдХ

    • [ ] COBOL рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЧреНрд▓рд┐рдорд░ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕

рдкреНрд░рд╢реНрди рдЦреЛрд▓реЗрдВ

  1. рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рдХреНрдпрд╛ рд╣реИрдВ? рдХреНрдпрд╛ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдШрдЯрдХ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреЛ рд╣реБрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
  2. рдЖрдк рдШрдЯрдХ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдирдВрдЧреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд░реНрдЧреЛрдВ (рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╕реНрдерд┐рд░ create() рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ? рдПрдХ рдШрдЯрдХ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред
  3. CustomComponentManager рдЬреИрд╕реЗ "рдРрдбрдСрди рдПрдкреАрдЖрдИ" рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рдХрд╣рд╛рдВ рд╣реИ?
  4. рд╣рдо CustomComponentManager рд╡рд░реНрдЬрдирд┐рдВрдЧ рдХреЛ рдХреИрд╕реЗ рд╣реИрдВрдбрд▓ рдХрд░рддреЗ рд╣реИрдВ?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@dbbk рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдХрд╛рд░рдг рд╣рдореЗрдВ {{...attributes}} рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреА рддрд░рд╣ рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдХрд░реНрд▓реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЪрд╛рд░ рдХрдо рд╡рд░реНрдгреЛрдВ рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдХрдо рджреГрд╖реНрдЯрд┐ рд╕реЗ рд╢реЛрд░ рд╣реЛрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╣ рдорд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ attributes рджрд╛рдпрд░реЗ рдореЗрдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ- рдЖрдк <SomeComponent something={{attributes}} /> рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреЛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕реБрдЭрд╛рд╡ рджреЗрдЧрд╛ред рдЗрд╕рдХрд╛ рдпрд╣ рднреА рдЕрдзрд┐рдХ рджреГрдврд╝рддрд╛ рд╕реЗ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рд╕реНрдкреНрд░реЗрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрдиреНрдп рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

@arguments рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдирд╛рдиреЗ рдФрд░ рд╣реИрдВрдбрд▓рдмрд╛рд░реНрд╕ рдореЗрдВ ... рд╕реНрдкреНрд░реЗрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рддрддреНрдХрд╛рд▓ рд░реЛрдбрдореИрдк рдкрд░ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдо ...attributes рдХреЛ {{...@attributes}} рдпрд╛ рдРрд╕рд╛ рдХреБрдЫред

@ рдЧреМрд░рд╡ 0 рдПрдореНрдмрд░ рдРрдкреНрд╕ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЧреНрд▓рд┐рдорд░ рдШрдЯрдХ рдПрдкреАрдЖрдИ рдЖрд░рдПрдлрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ

@ Turbo87 рдмрдврд╝рд┐рдпрд╛ рд╕реБрдЭрд╛рд╡, рдореИрдВ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЧрд╛рдЗрдб

рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ didReceiveAttrs() рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░реВрдВрдЧрд╛ рдЬрдм рд╕реЗ рдЖрдкрдиреЗ рдЗрд╕реЗ рд▓рд╛рдпрд╛ рдерд╛ред рдЖрдо рддреМрд░ рдкрд░ рд▓реЛрдЧ рдкрд╛рд░рд┐рдд рддрд░реНрдХреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдШрдЯрдХ рд╕реНрдерд┐рддрд┐ рдХреЗ рдХреБрдЫ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдЗрди рд╣реБрдХреЛрдВ рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрднреА рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд▓реЛрдЧ рдЗрди рд╣реБрдХреЛрдВ рдореЗрдВ рдЪреМрдВрдХрд╛рдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬреЗрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рддрд┐рдкрд╛рджрди рдЧрд░реНрдо рдкрде рдкрд░ рд╣реИрдВред

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛:

import Component from "@ember/component";
import { computed } from "@ember/object";

export default Component.extend({
  didReceiveAttrs() {
    this.set('firstName', this.attrs.firstName || 'Tobias');
    this.set('lastName', this.attrs.lastName || 'Bieniek');
  },

  fullName: computed('firstName', 'lastName', function() {
    return `${this.firstName} ${this.lastName}`;
  })
});

рдЗрд╕реЗ рдХрд░реЗрдВ:

import Component, { tracked } from "@glimmer/component";

export default class extends Component {
  <strong i="27">@tracked</strong> get firstName() {
    return this.args.firstName || 'Tobias';
  }

  <strong i="28">@tracked</strong> get lastName() {
    return this.args.lastName || 'Bieniek';
  }

  <strong i="29">@tracked</strong> get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдБ рдХрд┐ рдкрд╣рд▓реЗ рдореБрдЭреЗ рдЗрд╕ рдкрд░ рд╕рдВрджреЗрд╣ рдерд╛, рд▓реЗрдХрд┐рди @wycats рдиреЗ рдореБрдЭреЗ рдордирд╛ рд▓рд┐рдпрд╛, рдФрд░ рдкрд┐рдЫрд▓реЗ рдПрдХ-рдПрдХ рд╕рд╛рд▓ рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ Glimmer.js рдРрдк рдмрдирд╛рдиреЗ рдХреЗ рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, рд╣рдо рдХрднреА рднреА didReceiveAttrs рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╣реАрдВ рднрд╛рдЧреЗред рдЬрд┐рд╕реЗ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдкрд░рд┐рдХрд▓рд┐рдд рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд░реВрдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ред

рд╕рднреА 23 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрджрд┐ рдЖрдк рдорджрдж рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдореНрдмрд░ рд╕рдореБрджрд╛рдп рд╕реНрд▓реИрдХ рдкрд░ #st-glimmer-components рдЪреИрдирд▓ рдореЗрдВ рдХрд╛рдо рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд░реЗрдВрдЧреЗ! рдпрджрд┐ рдЖрдк рдЙрддреНрд╕реБрдХ рд╣реИрдВ рдХрд┐ рд╕реЙрд╕реЗрдЬ рдХреИрд╕реЗ рдмрдирддрд╛ рд╣реИ, рддреЛ рд▓рд░реНрдХрд░реНрд╕ рдХрд╛ рднреА рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ;

{{! src/ui/components/UserAvatar/template.hbs }}
<div ...attributes> {{! <-- attributes will be inserted here }}
  <h1>Hello, {{@firstName}}!</h1>
</div>

рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдЧрддрд┐рд╢реАрд▓ рдЪрд░ ( {{@firstName}} ) рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдШреБрдВрдШрд░рд╛рд▓реЗ рдХреЛрд╖реНрдардХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рднрд╛рдЬрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдирд╣реАрдВ? рдореЗрд░реЗ рд▓рд┐рдП рдиреЗрддреНрд░рд╣реАрди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ <div ...attributes> рдЬреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ <div {{...attributes}}> ?

рдХреНрдпрд╛ рдЭрд┐рд▓рдорд┐рд▓рд╛рддреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд░рдПрдлрд╕реА рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдо рдЪрд░реНрдЪрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

@tomdale рдКрдкрд░ рджрд┐рдП рдЧрдП рдореБрджреНрджреЗ рдореЗрдВ рдШрдЯрдХ didReceiveAttrs() рдЕрдм рдХреЛрдИ рдЪреАрдЬ рдирд╣реАрдВ рдереА, рдФрд░ рдХреБрдЫ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдирдП рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рдкреИрдЯрд░реНрди рдореЗрдВ рдХреИрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

@dbbk рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдХрд╛рд░рдг рд╣рдореЗрдВ {{...attributes}} рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреА рддрд░рд╣ рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдХрд░реНрд▓реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЪрд╛рд░ рдХрдо рд╡рд░реНрдгреЛрдВ рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдХрдо рджреГрд╖реНрдЯрд┐ рд╕реЗ рд╢реЛрд░ рд╣реЛрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╣ рдорд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ attributes рджрд╛рдпрд░реЗ рдореЗрдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ- рдЖрдк <SomeComponent something={{attributes}} /> рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреЛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕реБрдЭрд╛рд╡ рджреЗрдЧрд╛ред рдЗрд╕рдХрд╛ рдпрд╣ рднреА рдЕрдзрд┐рдХ рджреГрдврд╝рддрд╛ рд╕реЗ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рд╕реНрдкреНрд░реЗрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрдиреНрдп рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

@arguments рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдирд╛рдиреЗ рдФрд░ рд╣реИрдВрдбрд▓рдмрд╛рд░реНрд╕ рдореЗрдВ ... рд╕реНрдкреНрд░реЗрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рддрддреНрдХрд╛рд▓ рд░реЛрдбрдореИрдк рдкрд░ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдо ...attributes рдХреЛ {{...@attributes}} рдпрд╛ рдРрд╕рд╛ рдХреБрдЫред

@ рдЧреМрд░рд╡ 0 рдПрдореНрдмрд░ рдРрдкреНрд╕ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЧреНрд▓рд┐рдорд░ рдШрдЯрдХ рдПрдкреАрдЖрдИ рдЖрд░рдПрдлрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ

@ Turbo87 рдмрдврд╝рд┐рдпрд╛ рд╕реБрдЭрд╛рд╡, рдореИрдВ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЧрд╛рдЗрдб

рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ didReceiveAttrs() рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░реВрдВрдЧрд╛ рдЬрдм рд╕реЗ рдЖрдкрдиреЗ рдЗрд╕реЗ рд▓рд╛рдпрд╛ рдерд╛ред рдЖрдо рддреМрд░ рдкрд░ рд▓реЛрдЧ рдкрд╛рд░рд┐рдд рддрд░реНрдХреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдШрдЯрдХ рд╕реНрдерд┐рддрд┐ рдХреЗ рдХреБрдЫ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдЗрди рд╣реБрдХреЛрдВ рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрднреА рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд▓реЛрдЧ рдЗрди рд╣реБрдХреЛрдВ рдореЗрдВ рдЪреМрдВрдХрд╛рдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬреЗрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рддрд┐рдкрд╛рджрди рдЧрд░реНрдо рдкрде рдкрд░ рд╣реИрдВред

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛:

import Component from "@ember/component";
import { computed } from "@ember/object";

export default Component.extend({
  didReceiveAttrs() {
    this.set('firstName', this.attrs.firstName || 'Tobias');
    this.set('lastName', this.attrs.lastName || 'Bieniek');
  },

  fullName: computed('firstName', 'lastName', function() {
    return `${this.firstName} ${this.lastName}`;
  })
});

рдЗрд╕реЗ рдХрд░реЗрдВ:

import Component, { tracked } from "@glimmer/component";

export default class extends Component {
  <strong i="27">@tracked</strong> get firstName() {
    return this.args.firstName || 'Tobias';
  }

  <strong i="28">@tracked</strong> get lastName() {
    return this.args.lastName || 'Bieniek';
  }

  <strong i="29">@tracked</strong> get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдБ рдХрд┐ рдкрд╣рд▓реЗ рдореБрдЭреЗ рдЗрд╕ рдкрд░ рд╕рдВрджреЗрд╣ рдерд╛, рд▓реЗрдХрд┐рди @wycats рдиреЗ рдореБрдЭреЗ рдордирд╛ рд▓рд┐рдпрд╛, рдФрд░ рдкрд┐рдЫрд▓реЗ рдПрдХ-рдПрдХ рд╕рд╛рд▓ рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ Glimmer.js рдРрдк рдмрдирд╛рдиреЗ рдХреЗ рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, рд╣рдо рдХрднреА рднреА didReceiveAttrs рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╣реАрдВ рднрд╛рдЧреЗред рдЬрд┐рд╕реЗ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдкрд░рд┐рдХрд▓рд┐рдд рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд░реВрдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ред

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

рд╣рд╛рдБ, рдореИрдВ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдиреАрдореЗрд╢рди рд╣реИред рдЬрдм рдореИрдВ collapsed true рд╕реЗ false рдмрджрд▓рддрд╛ рд╣реВрдВ рдФрд░ рджреВрд╕рд░реА рджрд┐рд╢рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдПрдиреАрдореЗрд╢рди рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣ рдЪрдордХрджрд╛рд░ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛?

@ Turbo87 @Gaurav0 рдЖрд╣ рдареАрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рднреА рдкреНрд░рджрд░реНрд╢рди рдлрд╝реБрдЯ рдЧрди рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ didReceiveAttrs рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрд┐ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реИ! рдПрдирд┐рдореЗрд╢рди рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдЬреИрд╕реЗ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рдЪреАрдЬ рдХреЛ didInsertElement рдпрд╛ didUpdate рдЬреИрд╕реЗ async рд╣реБрдХ рдореЗрдВ рд╢реЗрдбреНрдпреВрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

didInsertElement рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдирд╣реАрдВ рд▓рдЧ рд░рд╣рд╛ рд╣реИред didUpdate рдХреЗрд╡рд▓ рддрднреА рдЯреНрд░рд┐рдЧрд░ рд▓рдЧрддрд╛ рд╣реИ рдЬрдм рдШрдЯрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╣реА? рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЙрд╕ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ? рддреЛ рдШрдЯрдХ рддрд░реНрдХ рдмрджрд▓рддреЗ рд╕рдордп рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП didUpdate рдХрднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ didInsertElement рдЕрдЧрд░ рд╣рдо рдХреБрдЫ рднреА рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВ рддреЛ рдЧреНрд▓рд┐рдорд░ рдореЗрдВ рдПрдХ рдХрдард┐рди рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИред

@ Turbo87 рдЬрдм didUpdate рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд▓рдд рдзрд╛рд░рдгрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╣ рд╣реБрдХ рддрдм рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рдПрдХ рдЯреНрд░реИрдХ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ _рдпрд╛ рдПрдХ рдкрд╛рд░рд┐рдд рддрд░реНрдХ_ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ: http://tinyurl.com/y7osxpy2ред рдЬрдм рдкреИрд░реЗрдВрдЯ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХрд┐рд╕реА рддрд░реНрдХ рдореЗрдВ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рддреЛ рдЪрд╛рдЗрд▓реНрдб рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЛ рдЙрд╕рдХрд╛ didUpdate рд╣реБрдХ рдорд┐рд▓рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рдЙрд╕ рддрд░реНрдХ рдХрд╛ рдХрднреА рднреА "рдЗрд╕реНрддреЗрдорд╛рд▓" рди рдХрд┐рдпрд╛ рд╣реЛред

@ рдЧреМрд░рд╡0 рдЖрдк рдЧреЛрд▓рдкреЛрд╕реНрдЯ рдХреЛ рдЖрдЧреЗ didInsertElement рдореЗрдВ рд╣реЛрдиреЗ рдкрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирддрд╛ред рдпрджрд┐ рдЖрдк рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЖрд▓рд╕реА рдЧреЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдЬрд╛рдХреНрд╕ рдХреЗ рдмрд╛рдж рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рддреНрд░реБрдЯрд┐ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдИрд╡реЗрдВрдЯ рд▓реВрдк рдореЗрдВ рд╣реЛрдЧрд╛ред

рдареАрдХ рд╣реИ, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ рд╡реИрд╕реЗ рднреА рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪреАрдЬрд╝ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдмрд╕ рдЗрд╕ рдмрд╛рдд рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЧрд╛рдЗрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА :)

@tomdale рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рдЕрджреНрдпрддрд┐рдд рд╣реИ? рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдХреНрд░рд┐рдп рд▓рдЧрддрд╛ рд╣реИред

@tomdale рдареАрдХ рд╣реИ, рдкрд░рд┐рджреГрд╢реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рд╡рд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ рддреЛ рд╣рдореЗрдВ AJAX рдЕрдиреБрд░реЛрдз рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рдо рдПрдХ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдЕрднреА рднреА didInsertElement рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@ рдЧреМрд░рд╡0 рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдХреНрдпрд╛ рд╣реИ? рдбреАрдбреАрдПрдпреВ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рднреА рдХреЛрдб рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЬреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, AJAX рдЕрдиреБрд░реЛрдз рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╡рд┐рд╢реЗрд╖рддрд╛ рдореВрд▓ рдШрдЯрдХ/рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рдмрджрд▓ рд░рд╣реА рд╣реИред рдбреАрдбреАрдПрдпреВред

@ рдЧреМрд░рд╡ 0 @ рдЯреЙрдордбреЗрд▓ рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдШрдЯрдХреЛрдВ рдХрд╛ рдПрдХ (рдЬреНрдпрд╛рджрд╛рддрд░) "рдбреАрдУрдПрдо-рдХрдо" рд╕реЗрдЯ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп "рдСрдмреНрдЬреЗрдХреНрдЯ" рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╡рд░реНрддрдорд╛рди рдЙрджрд╛рд╣рд░рдг рдПрдореНрдмрд░-рд▓реАрдлрд▓реЗрдЯ/ рдПрдореНрдмрд░-рдХрдВрдкреЛрдЬрд┐рдмрд┐рд▓рд┐рдЯреА-рдЯреВрд▓реНрд╕ рд╣реЛрдЧрд╛ рдЬреЛ рдПрдХ рд▓реАрдлрд▓реЗрдЯ рдореИрдк рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдШреЛрд╖рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА didReceiveAttrs рдпрд╛ observer рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдЕрднреА рдЧреНрд▓рд┐рдорд░ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯрд╛ рдЬрд╛рдПрдЧрд╛/рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

@nickschot рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд▓реЗ рд╕рдХрддрд╛ рд╣реВрдВ, рд╣рдордиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рдРрдбрдСрди рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреА рдбрд┐рдЬрд╛рдЗрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдПрдХ рдСрдбрд┐рдЯ рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ ember-leaflet рдХрд╡рд░ рдХрд┐рдпрд╛ рдерд╛ред

рдпрджрд┐ рдЖрдк ember-leaflet / ember-composability-tools рдореЗрдВ рдЦреЛрджрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрднреА рднреА didReceiveAttrs рдпрд╛ didUpdate рдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд┐рд╕реА рднреА рдЬреАрд╡рдирдЪрдХреНрд░ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ . рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ init рдФрд░ willDestroy рд╣реБрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддрд╛рдХрд┐ рдШрдЯрдХреЛрдВ рдХреЛ рдЕрдкрдиреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ (рдФрд░ рдЕрдВрддрддрдГ, рдореВрд▓ рдкреНрд░рддрд┐рдкрд╛рджрди рдорд╛рддрд╛-рдкрд┐рддрд╛) рдкрд░ рдЦреБрдж рдХреЛ рдкрдВрдЬреАрдХреГрдд/рдЕрдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХреЗрдВред рдпрд╣ рдЧреНрд▓рд┐рдорд░ рдШрдЯрдХреЛрдВ рдореЗрдВ constructor рдФрд░ willDestroy рд╣реБрдХ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореВрд▓ рдореВрд▓ рдШрдЯрдХ _does_ рдХреЛ didInsertElement рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ {{did-insert}} рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк {{did-insert}} / {{did-update}} рдХрд╛ рдЙрдкрдпреЛрдЧ DOM рддрддреНрд╡реЛрдВ рдкрд░ рдХрд┐рд╕реА рднреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпреЗ рд╕реНрд╡рддрдГ рдЯреНрд░реИрдХ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдирдореЗрдВ рдПрдХ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдорд╛рди рдмрджрд▓рдиреЗ рдкрд░ рд╡реЗ рдлрд┐рд░ рд╕реЗ рдЪрд▓реЗрдВрдЧреЗред рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╕реНрдЯрдо рд╕рдВрд╢реЛрдзрдХ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рднреА рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред

рдПрдХ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рд╣рдж рддрдХ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЬреЛ рдЧреНрд▓рд┐рдорд░ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ - ember-google-maps рдПрдбрдСрди рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдПрдХ "рд░реЗрдВрдбрд░ рдбрд┐рдЯреЗрдХреНрдЯрд░"ред рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдмрд╣реБрдд рдХрдо рдЖрдо рд╣реИ (рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдпрд╣ рдПрдХ рдЙрдкрдпреЛрдЧ рдорд┐рд▓рд╛), рдФрд░ рдЬрд┐рд╕реЗ рдпрд╛ рддреЛ MutationObserver рдорд╛рдзреНрдпрдо рд╕реЗ DOM рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдПрдХ рдХрд╕реНрдЯрдо рдШрдЯрдХ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ didUpdate / didRender рд╣реБрдХред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрджреНрджреЗрд╢реНрдп <RenderDetector> рдШрдЯрдХ рдЗрди рд╕рднреА рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдШрдЯрдХ рдХреЛ рдПрдХ рдПрдХрд▓, рдЖрд╕рд╛рдиреА рд╕реЗ рдЦреЛрдЬрдиреЗ рд╡рд╛рд▓реЗ рдШрдЯрдХ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрдЯреНрд░реА рджреЗрдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЕрд▓рдЧ рдХрд░реЗрдЧрд╛ред

@pzuraq рдХреБрдЫ рд╕рдордп рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЫреЛрдЯрд╛ рдЕрдкрдбреЗрдЯ рд╣реИред рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрди рдШрдЯрдХреЛрдВ рдХреЗ рднреАрддрд░ рдХреЛрдИ рдбреЛрдо рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬреЛ рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдПрдХ рдХрд╕реНрдЯрдо рдШрдЯрдХ рдкреНрд░рдмрдВрдзрдХ w/рдЧреНрд▓рд┐рдорд░ рд╕реЗрдореЗрдиреНрдЯрд┐рдХреНрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ didUpdate рд╣реБрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред

@nickschot рд╣рдорд╛рд░реА рд╕рд┐рдлрд╛рд░рд┐рд╢ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рд╣рд╛рдпрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдпрджрд┐ рдЖрдк рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ рддреЛ рд╣реЗрд▓реНрдкрд░реНрд╕ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ useEffect рд╕рдорд╛рди рдХреБрдЫ рднреА рдирд╣реАрдВ рдФрд░ рд╕рд╛рдЗрдб-рдЗрдлреЗрдХреНрдЯ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬрдмрдХрд┐ рд╕рдВрд╢реЛрдзрдХ useLayoutEffect )ред

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

@pzuraq рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдХреНрдпрд╛ рд╣рдореЗрдВ рдПрдХ рдХрд╕реНрдЯрдо рд╕рд╣рд╛рдпрдХ рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдпрд╛ рдХреЛрдИ рд╕рд╣рд╛рдпрдХ рдХрд░реЗрдЧрд╛?

рдХреНрдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрд╕ рддрд░рд╣ рд╣реИ?

{{concat (did-insert this.myAction)}}

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдФрд░ "рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛" рдирд╣реАрдВ рд╣реИред

рдпрд╛ рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдмрдЬрд╛рдп рд╕рд╣рд╛рдпрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

{{my-did-insert this.myAction}}

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

рдХреГрдкрдпрд╛ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдирд┐рдпрдорд┐рдд рдПрдореНрдмрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдорд╛рдорд▓рд╛ рдХрд╛рдлреА рдЧреВрдврд╝ рд╣реИ, рдкреНрд░рд▓реЗрдЦрди рдХреА рдХрдореА рд╣реИ рдФрд░ рдмрд┐рдЦрд░рд╛ рд╣реБрдЖ рд╣реИред

рдпрд╛ рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдмрдЬрд╛рдп рд╕рд╣рд╛рдпрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рд╕рд╣реА, рдмрд┐рд▓реНрдХреБрд▓ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдк рдПрдореНрдмрд░-рд░реЗрдВрдбрд░-рд╣реЗрд▓реНрдкрд░реНрд╕ рдореЗрдВ рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ @ember/render-modifiers API рдХреА рдирдХрд▓ рдХрд░рддрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, compute рдкрд╣рд▓реА рдмрд╛рд░ рдПрдХ рд╕рд╣рд╛рдпрдХ рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ/рдЧрдгрдирд╛ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣рд░ рдмрд╛рд░ рдЗрд╕рдХреЗ рдХрд┐рд╕реА рднреА рддрд░реНрдХ рдХреЛ рдмрджрд▓рдиреЗ рдкрд░ рдлрд┐рд░ рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ 3.13+ рдореЗрдВ рдСрдЯреЛрдЯреНрд░реИрдХ рднреА рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЛ {{did-insert}} рдХреА рддрд░реНрдЬ рдкрд░ рдХреБрдЫ рдЪрд╛рд╣рд┐рдП, рддреЛ рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

export default class didInsert extends Helper {
  compute(fn) {
    if (!this.rendered) {
      fn();
      this.rendered = true;
    }
  }
}

рдФрд░ рдХреЛрдИ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рдФрд░ рдЧреВрдврд╝ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЪреАрдЬреЛрдВ рдХреЗ рдЕрддреНрдпрд╛рдзреБрдирд┐рдХ/рдХреИрдирд░реА рдкрдХреНрд╖ рдкрд░ рд╣реЛрдиреЗ рдХреА рдкреНрд░рдХреГрддрд┐ рд╣реИ, рд╣рдордиреЗ рдЕрднреА рддрдХ рд╕рднреА рдирдП рдкреИрдЯрд░реНрди рдХреЛ рдкреНрд░рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╣рдо рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЕрдм рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдСрдХреНрдЯреЗрди рдмрд╛рд╣рд░ рд╣реИ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

escobera picture escobera  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ggayowsky picture ggayowsky  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kellyselden picture kellyselden  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

irminsul picture irminsul  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

stevesims picture stevesims  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ