Ember.js: [QUEST] ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ мСрцания Π² Ember

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 28 Ρ„Π΅Π²Ρ€. 2018  Β·  23ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: emberjs/ember.js

Π’ этом выпускС квСста отслСТиваСтся рСализация ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Glimmer Π² Ember.js.

План

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Glimmer.js ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ особСнности:

  1. Π¨Π°Π±Π»ΠΎΠ½Ρ‹ Β«Π’Π½Π΅ΡˆΠ½ΠΈΠΉ HTMLΒ» (Π±Π΅Π· tagName , attributeBindings ΠΈ Ρ‚. Π”.)
  2. АргумСнты Π² ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… ΠΈΠΌΠ΅ΡŽΡ‚ прСфикс @ , Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ {{@firstName}}
  3. АргумСнты ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π·Π°Π΄Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ this.args
  4. ΠšΠ»Π°ΡΡΡ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ синтаксис класса JavaScript
  5. БостояниС измСняСмого ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° аннотируСтся свойствами @tracked
  6. ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ синтаксиса <AngleBracket />
  7. Атрибуты ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Β«Ρ€Π°Π·Π±ΠΈΡ‚Ρ‹Β» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ …attributes

БлСдуя Π΄ΡƒΡ…Ρƒ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΠΈΠ·ΠΌΠ° Ember, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎ частям с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ надстройки. Π­Ρ‚ΠΎ позволяСт сообщСству Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ связь Π½Π° Ρ€Π°Π½Π½ΠΈΡ… этапах процСсса.

ЀактичСски, ΠΌΡ‹ ΡƒΠΆΠ΅ Π½Π°Ρ‡Π°Π»ΠΈ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ Glimmer Π² Ember. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡƒΠΆΠ΅ Π½Π°Ρ‡Π°Π»ΠΈ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ:

  1. Π’ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ…, содСрТащих Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой «внСшний HTMLΒ» (ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ функция template-only-glimmer-components ).
  2. Доступ ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ Π² шаблонС ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· прСфикс @ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, {{@firstName}} ).

Π’ этом выпускС прСдлагаСтся Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ процСсс пСрСноса ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Glimmer Π² Ember, Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠ² надстройкам ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ @glimmer/component Π² надстройку Ember, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΡƒΡŽ API ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Glimmer.js.

ΠœΡ‹ Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌ эту Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π° этапы, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ прСимущСства для ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ Ember. Π€Π°Π·Π° 0 связана с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² Π² Ember.js для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Π€Π°Π·Ρ‹ 1, 2 ΠΈ 3 посвящСны постСпСнному Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ API ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Glimmer.js.

Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΌΡ‹ углубимся Π² этапы 0 ΠΈ 1, ΠΌΡ‹ ΠΎΡ‚Π»ΠΎΠΆΠΈΠΌ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ тСхничСских Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ… этапов Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΠ΅Ρ€Π²Ρ‹Π΅ этапы Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π±Π»ΠΈΠΆΠ΅ ΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ.

Π­Ρ‚Π°ΠΏ 0: настройка повСдСния ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²

TL; DR: Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ API CustomComponentManager Π² Ember.js, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ надстройкам Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ API ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

Π’ настоящСС врСмя прСдполагаСтся, Ρ‡Ρ‚ΠΎ всС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Ember ΡΠ²Π»ΡΡŽΡ‚ΡΡ подклассами Ember.Component . Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ API ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π² Ember, Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ способ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ Ember, ΠΊΠΎΠ³Π΄Π° ΠΈ ΠΊΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°.

Когда ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Β«ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ нСстандартных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²Β», ΠΌΡ‹ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ ΠΈΠΌΠ΅Π΅ΠΌ Π² Π²ΠΈΠ΄Ρƒ:

  1. Как ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ экзСмпляры ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².
  2. Как ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°ΡŽΡ‚ΡΡ экзСмпляры ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².
  3. Как Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ экзСмпляру ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°.
  4. Как ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ увСдомляСтся ΠΎΠ± этих измСнСниях ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°.

Π₯отя Glimmer VM Π²Π²ΠΎΠ΄ΠΈΡ‚ понятиС «диспСтчСр ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²Β», ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ эти Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, этот API ΠΎΡ‡Π΅Π½ΡŒ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня. Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΈΡ… Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π² качСствС общСдоступного API Π² Ember, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΈΡ… слоТно ΠΏΠΈΡΠ°Ρ‚ΡŒ, Π»Π΅Π³ΠΊΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ это Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΈ ΠΎΠ½ΠΈ Π΅Ρ‰Π΅ Π½Π΅ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹.

ВмСсто этого ΠΌΡ‹ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ Ember API ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ CustomComponentManager ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ шаблон Π΄Π΅Π»Π΅Π³Π°Ρ‚Π°. CustomComponentManager обСспСчиваСт ΠΌΠ΅Π½ΡŒΡˆΡƒΡŽ ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ повСрхности API, Ρ‡Π΅ΠΌ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ ComponentManager Glimmer VM API, Ρ‡Ρ‚ΠΎ позволяСт Π°Π²Ρ‚ΠΎΡ€Π°ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π² «яму успСха».

Π˜Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ember ΡƒΠ·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°? ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ итСрация RFC для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² прСдставила ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ ComponentDefinition , структуры Π΄Π°Π½Π½Ρ‹Ρ…, которая Π±Ρ‹Π»Π° с Π³ΠΎΡ‚ΠΎΠ²Π½ΠΎΡΡ‚ΡŒΡŽ зарСгистрирована Π² Ember ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π»Π°, ΠΊΠ°ΠΊΠΎΠΉ диспСтчСр ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

Одним ΠΈΠ· основных прСимущСств ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ComponentDefinition являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ диспСтчСра ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π²ΠΎ врСмя сборки. К соТалСнию, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ API для Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, ΠΈ, вСроятно, ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ с ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΎΠΌ сборки.

ВмСсто этого ΠΌΡ‹ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ API для настройки диспСтчСра ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π²ΠΎ врСмя выполнСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ ΠΊ классу ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. Π­Ρ‚ΠΎΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ шаг позволяСт ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с диспСтчСрами настраиваСмых ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΏΠΎΠΊΠ° разрабатываСтся Π±ΠΎΠ»Π΅Π΅ долгосрочноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ диспСтчСра настраиваСмых ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²

Π’ этой ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ явно ΡΠΎΠ³Π»Π°ΡˆΠ°Ρ‚ΡŒΡΡ Π½Π° использованиС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Они Π΄Π΅Π»Π°ΡŽΡ‚ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ componentManager , экспортируСмой Ember, которая Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π²ΠΎ врСмя выполнСния, ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ класса ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²:

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 {
  // ...
}

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ этого ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Ember провСряСт класс, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Ρƒ Π½Π΅Π³ΠΎ аннотация диспСтчСра настраиваСмых ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Если это Ρ‚Π°ΠΊ, ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ строковоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для поиска Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ember Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Ρƒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° component-manager:glimmer .

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, надстройки ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сСмантику ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для прСдоставлСния настраиваСмых диспСтчСров ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Наш Π°Π΄Π΄ΠΎΠ½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Glimmer ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ диспСтчСр ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΈΠ· addon/component-managers/glimmer.js ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΡ€Π°Π²ΠΈΠ» Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

Π₯отя этот API многословСн ΠΈ Π½Π΅ особСнно эргономичСн, прилоТСния ΠΈ надстройки ΠΌΠΎΠ³ΡƒΡ‚ Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Π½Π΅Π³ΠΎ, вводя собствСнный Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс с Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ. НапримСр, Ссли Π°Π΄Π΄ΠΎΠ½ с ΠΈΠΌΠ΅Π½Π΅ΠΌ 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 ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ прСдставлСний. ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Ember ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ свой Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρ‡Π΅Ρ€Π΅Π· свойство parentView . Π”Π°ΠΆΠ΅ Ссли Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ элСмСнт Π½Π΅ являСтся Ember.Component , Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Ember всС Ρ€Π°Π²Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ свойство parentView .

Π’ настоящСС врСмя CurlyComponentManager Π² Ember ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ этого состояния, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ внСшнСго «состояния области дСйствия», Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Ρ†Π΅Π»ΡŒ дСйствий.

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π΄Π°Ρ‚ΡŒ ΠΏΠ»ΠΎΡ…ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ΡŒ ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ систСмС, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ шаблон для настройки повСдСния, скрывая острыС ΡƒΠ³Π»Ρ‹ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ API.

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: ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ мСрцания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ember

Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ класс Component Π² Ember ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ список Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… большС Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ. Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ.

Π’ качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ шага ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ способ Π²Ρ‹Π±ΠΎΡ€Π° ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ API ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Glimmer.js Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°ΠΊΠ΅Ρ‚ @glimmer/component . Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ, ΠΌΡ‹ прСдоставим Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Glimmer Component ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ наслСдуСтся ΠΎΡ‚ Ember.Object адрСсу @glimmer/component/compat .

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ выглядит Β«ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ember-GlimmerΒ»:

// 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 Π° Π½Π΅ Π² настройкС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… свойств ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ.
  • Они ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΡƒΡŽ модСль Ember . Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ инструмСнты, ΠΊΠ°ΠΊ вычисляСмыС свойства ΠΈ миксины, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Ember ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

НС ΠΌΠ΅Π½Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ:

  • Бвойства @tracked Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ Π΄ΠΎ Ρ„Π°Π·Ρ‹ 3.
  • Π£ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π½Π΅Ρ‚ свойств layout ΠΈΠ»ΠΈ template .
  • Никаких ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈΠ»ΠΈ свойств, относящихся ΠΊ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ прСдставлСний, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ childViews , parentView , nearestWithProperty ΠΈ Ρ‚. Π”.
  • НСт tagName , attributeBindings ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ настраиваСмого JavaScript DSL для измСнСния ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ элСмСнта.
  • НСт send ΠΈΠ»ΠΈ sendAction для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ событий.
  • НСт ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ember-view class ΠΈΠ»ΠΈ автоматичСски сгСнСрированного ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° элСмСнта guid.
  • НСт Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° rerender() .
  • НСт свойства attrs (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ вмСсто Π½Π΅Π³ΠΎ args ).
  • ΠŸΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Β«ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌΠΈΒ» ΠΈ Π½Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ двусторонних привязок.
  • ΠŸΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π½Π΅ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ свойства Π² экзСмплярС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, Ρ‡Ρ‚ΠΎ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ‚Ρ€ΡƒΠ΄Π½Ρ‹Ρ… для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² ΠΈΠΌΠ΅Π½.
  • НСт this.$() для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° jQuery для элСмСнта ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°.
  • Никаких Ρ€ΡƒΡ‡Π½Ρ‹Ρ… appendTo ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π² DOM.
  • НС ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ события ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°:

    • willInsertElement

    • didRender

    • willRender

    • willClearRender

    • willUpdate

    • didReceiveAttrs

    • didUpdateAttrs

    • parentViewDidChange

  • НСт ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Ρ‚Π΅Π»Ρ событий on() для событий ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²; Ρ…ΡƒΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹.

Одним ΠΈΠ· интСрСсных ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов этого Π½Π°Π±ΠΎΡ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ согласуСтся с усилиями ΠΏΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ классов JavaScript . Π’ сочСтании с Π΄ΠΈΠ·Π°ΠΉΠ½ΠΎΠΌ, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ Π² RFC для классов ES , ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°:

// 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 позволяСт Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠ³Π»ΠΎΠ²Ρ‹Π΅ скобки ( <UserAvatar @user={{currentUser}} /> ) Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹ΠΌ скобкам ( {{my-component 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 Π² Ember. Π”Π΅Ρ‚Π°Π»ΠΈ взаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΉ модСлью Ember ΠΈ отслСТиваСмыми свойствами Π² настоящСС врСмя ΠΏΡ€ΠΎΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ отслСТиваСмыС свойства появятся, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ смогут ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ @glimmer/component/compat ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΎΡ‚ Ember.Object.

Π’ сочСтании с Π½Π΅Π΄Π°Π²Π½ΠΎ объСдинСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Β«autotrackΒ» (которая автоматичСски опрСдСляСт зависимости вычислСнных свойств) это Π΄ΠΎΠ»ΠΆΠ½ΠΎ привСсти ΠΊ Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅ΠΌΡƒ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΡŽ ΠΊΠΎΠ΄Π° прилоТСния:

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 Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Glimmer для совмСстимости с ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ CSS?

Π΄Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

<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] Resolver Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ классы
  • [x] Π Π΅Π·ΠΎΠ»Π²Π΅Ρ€Ρƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΉΡ‚ΠΈ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ диспСтчСр ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

    • [] Руководство для Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ ΠΎ Ρ‚ΠΎΠΌ, Π³Π΄Π΅ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Ρ‹

    • [] Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΡƒΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ? (@mixonic)

  • [x] Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ CustomComponentManager API

    • [x] ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ интСрфСйс CustomComponentManagerDelegate

    • [x] version

    • [x] create()

    • [x] getContext()

    • [x] update()

    • [x] destroy?()

    • [x] didCreate?()

    • [x] didUpdate?()

    • [x] getView?()

    • [x] ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ свойство version ΠΏΡ€ΠΈ создании

    • [x] Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ устройство

    • [x] Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ childViews ΠΈ parentView Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ…

    • [] Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ для Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π°

    • [] Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ для совмСстимости с Ember Inspector

Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ для ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Glimmer

  • [x] ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ sparkles-components addon

    • [x] Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ componentManager ΠΏΡ€ΠΈ использовании ΠΈΠ· Ember

    • [x] CustomComponentManager рСализация Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π° Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Ember

  • [] ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° использования @glimmer/component Π² качСствС надстройки Ember

    • [] Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ использовании ΠΈΠ· Glimmer.js

    • [] import Component from '@glimmer/component' прСдоставляСт простой Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс JavaScript.

    • [] import Component from '@glimmer/component/compat' прСдоставляСт Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс Ember.Object

      Погляди

  • [] Π₯ΡƒΠΊΠΈ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°

    • [x] статичСский create(injections)

    • [x] didInsertElement()

    • [x] willDestroy()

    • [x] didUpdate()

    • [x] ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ событий ( click() ΠΈ Ρ‚. Π΄.), Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ

  • [] Доступ ΠΊ элСмСнту

    • [] this.bounds

    • [] this.element псСвдоним вычисляСмого свойства для this.bounds

    • [] API Π½Π° основС ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² элСмСнтов для раскрытия элСмСнтов

  • [] АргумСнты

    • [x] this.args доступно Π² конструкторС

    • [x] this.args обновляСтся Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° didUpdate

    • [] this.args Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ бСсконСчный Ρ†ΠΈΠΊΠ» ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° (Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ)

  • [ ] ДокумСнтация

    • [ ] Как ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ

    • [] ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π΅Ρ€Π΅ΠΆΠ΅Π½ΠΈΡ

    • [] Волько для ΠΊΠ°Π½Π°Ρ€Π΅Π΅ΠΊ

    • [] Π”ΠΎ 1.0

    • [] «БовмСстимыС» ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Ember-Glimmer

    • [] Π’Π½Π΅ΡˆΠ½ΠΈΠ΅ HTML-ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹

    • [] Π₯ΡƒΠΊΠΈ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°

    • [] ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ вычисляСмых свойств



      • [] Как Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ args



    • [] Руководство ΠΏΠΎ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ / ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Glimmer для…

    • Руководства ΠΏΠΎ написанию эффСктивных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Glimmer для людСй, Π·Π½Π°ΠΊΠΎΠΌΡ‹Ρ… с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ

    • [] ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Glimmer для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Ember

    • [] ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Glimmer для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² React

    • [] ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Glimmer для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Angular

    • [] ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Glimmer для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π½Π° COBOL

ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ вопросы

  1. ΠšΠ°ΠΊΠΎΠ²Ρ‹ Π»ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ для дСйствий? Π­Ρ‚ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ?
  2. Как Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ простыС классы JavaScript (Ρ‚Π΅, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅Ρ‚ статичСского ΠΌΠ΅Ρ‚ΠΎΠ΄Π° create() ) Π² качСствС классов ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²? ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° каТСтся простым, Π½ΠΎ Π½Π° ΡƒΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΠ΅ слоТным.
  3. Π“Π΄Π΅ Π»ΡƒΡ‡ΡˆΠ΅ всСго Π·Π°Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Β«Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ APIΒ», Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ CustomComponentManager ?
  4. Как Π½Π°ΠΌ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ вСрсиями CustomComponentManager ?

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

@dbbk Бамая большая ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π°ΠΌ Π½Π΅ трСбуСтся {{...attributes}} Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ синтаксичСски Π½Π΅ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π΅Π½ с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки, ΠΈ Π½Π° Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ символа мСньшС, казалось, Π»Π΅Π³Ρ‡Π΅ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈ ΠΌΠ΅Π½Π΅Π΅ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎ ΡˆΡƒΠΌΠ½ΠΎ.

Π― Π΄ΡƒΠΌΠ°ΡŽ, это Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ людСй ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ attributes являСтся свойством Π² области видимости, Π½ΠΎ это Π½Π΅ Ρ‚Π°ΠΊ - Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ <SomeComponent something={{attributes}} /> , Ρ‡Ρ‚ΠΎ подсказываСт этот синтаксис. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ строго ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ синтаксис распространСния Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… позициях, ΠΊΠΎΠ³Π΄Π° это Π½Π΅ Ρ‚Π°ΠΊ.

Π‘Ρ‹Π»ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ ΠΊΠ°ΠΊ @arguments Π² качСствС ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ привязки шаблона, Ρ‚Π°ΠΊ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ синтаксис ... spread Π² Handlebars, Π½ΠΎ это Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅Ρ‚ Π² блиТайшСй Π΄ΠΎΡ€ΠΎΠΆΠ½ΠΎΠΉ ΠΊΠ°Ρ€Ρ‚Π΅. НС ΡƒΠ΄ΠΈΠ²Π»ΡŽΡΡŒ, Ссли Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ΠΌΡ‹ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ ...attributes Π½Π° {{...@attributes}} ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π² этом Ρ€ΠΎΠ΄Π΅.

@ Gaurav0 API ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Glimmer Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· RFC-процСсс, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² прилоТСниях Ember, Ссли ΠΌΡ‹ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. Π’ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΊ диспСтчСру нСстандартных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° приятная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ: ΠΌΡ‹ Π½Π΅ ΠΊΠ°Π½ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ API Β«ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ поколСния», Π½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌ ΡΠΎΡ€Π΅Π²Π½ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ своим достоинствам Ρ‡Π΅Ρ€Π΅Π· экосистСму надстроСк.

@ Turbo87 ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅, я добавлю Π² список руководство ΠΏΠΎ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Π½ΠΎΠ²Ρ‹ΠΌ API.

Π― ΠΎΠ±Ρ€Π°Ρ‰ΡƒΡΡŒ ΠΊ ΡΠ»ΡƒΡ‡Π°ΡŽ 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 Π² Slack сообщСства Ember, Ссли Π²Ρ‹ заинтСрСсованы Π² ΠΏΠΎΠΌΠΎΡ‰ΠΈ! Π›ΡŽΡ€ΠΊΠ΅Ρ€Ρ‹ Ρ‚ΠΎΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ΡΡ, Ссли Π²Π°ΠΌ просто интСрСсно, ΠΊΠ°ΠΊ Π΄Π΅Π»Π°ΡŽΡ‚ колбасу.

Π’ соотвСтствии с этим;

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

Π― Π½Π΅ понимаю, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для обозначСния динамичСских ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ( {{@firstName}} ), Π° Π½Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² со Π·Π½Π°ΠΊΠ°ΠΌΠΈ? На ΠΌΠΎΠΉ взгляд, Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎ это выглядит ΠΊΠ°ΠΊ <div ...attributes> . Для Сдинообразия Π½Π΅ Π»ΡƒΡ‡ΡˆΠ΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ <div {{...attributes}}> ?

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π»ΠΈ RFC для ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² glimmer, Π³Π΄Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ?

@tomdale Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Π°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅ΠΆΠΈΠΌΠ° didReceiveAttrs() большС Π½Π΅ сущСствуСт, ΠΈ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ, которая ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ распространСнныС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования Π½Π° Π½ΠΎΠ²Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ΠΎΠ²ΠΎΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ.

@dbbk Бамая большая ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π°ΠΌ Π½Π΅ трСбуСтся {{...attributes}} Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ синтаксичСски Π½Π΅ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π΅Π½ с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки, ΠΈ Π½Π° Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ символа мСньшС, казалось, Π»Π΅Π³Ρ‡Π΅ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈ ΠΌΠ΅Π½Π΅Π΅ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎ ΡˆΡƒΠΌΠ½ΠΎ.

Π― Π΄ΡƒΠΌΠ°ΡŽ, это Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ людСй ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ attributes являСтся свойством Π² области видимости, Π½ΠΎ это Π½Π΅ Ρ‚Π°ΠΊ - Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ <SomeComponent something={{attributes}} /> , Ρ‡Ρ‚ΠΎ подсказываСт этот синтаксис. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ строго ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ синтаксис распространСния Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… позициях, ΠΊΠΎΠ³Π΄Π° это Π½Π΅ Ρ‚Π°ΠΊ.

Π‘Ρ‹Π»ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ ΠΊΠ°ΠΊ @arguments Π² качСствС ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ привязки шаблона, Ρ‚Π°ΠΊ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ синтаксис ... spread Π² Handlebars, Π½ΠΎ это Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅Ρ‚ Π² блиТайшСй Π΄ΠΎΡ€ΠΎΠΆΠ½ΠΎΠΉ ΠΊΠ°Ρ€Ρ‚Π΅. НС ΡƒΠ΄ΠΈΠ²Π»ΡŽΡΡŒ, Ссли Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ΠΌΡ‹ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ ...attributes Π½Π° {{...@attributes}} ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π² этом Ρ€ΠΎΠ΄Π΅.

@ Gaurav0 API ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Glimmer Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· RFC-процСсс, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² прилоТСниях Ember, Ссли ΠΌΡ‹ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. Π’ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΊ диспСтчСру нСстандартных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° приятная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ: ΠΌΡ‹ Π½Π΅ ΠΊΠ°Π½ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ API Β«ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ поколСния», Π½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌ ΡΠΎΡ€Π΅Π²Π½ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ своим достоинствам Ρ‡Π΅Ρ€Π΅Π· экосистСму надстроСк.

@ Turbo87 ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅, я добавлю Π² список руководство ΠΏΠΎ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Π½ΠΎΠ²Ρ‹ΠΌ API.

Π― ΠΎΠ±Ρ€Π°Ρ‰ΡƒΡΡŒ ΠΊ ΡΠ»ΡƒΡ‡Π°ΡŽ 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 Π½Π΅ трСбуСтся для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π²Π΅Ρ‰Π΅ΠΉ. Но ΠΈΠ½ΠΎΠ³Π΄Π° это избавляло мСня ΠΎΡ‚ нСобходимости ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Ρ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ родитСля. НапримСр, Ρ‡Ρ‚ΠΎ, Ссли Π±Ρ‹ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ запрос ajax, Ссли ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² измСнился? Π― Π±Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π» Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт ΠΊ Π³Π΅Ρ‚Ρ‚Π΅Ρ€Ρƒ.

Π΄Π°, я Π΄ΡƒΠΌΠ°ΡŽ ΠΎΠ± Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ… использования. ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ - анимация. скаТСм, я Ρ…ΠΎΡ‡Ρƒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° collapsed измСнится с true Π½Π° false ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ. ΠΊΠ°ΠΊ это Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ мСрцания?

@ turbo87 @ Gaurav0 А, Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π·Π½Π°Ρ‡ΠΈΡ‚, систСма Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это всС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π½ΠΎΠΆΠ½Ρ‹Π΅ пистолСты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² синхронном didReceiveAttrs ! ВсС, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ анимация ΠΈΠ»ΠΈ сСтСвыС запросы, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π² асинхронных ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ didInsertElement ΠΈΠ»ΠΈ didUpdate .

didInsertElement , ΠΏΠΎΡ…ΠΎΠΆΠ΅, Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. didUpdate ΠΏΠΎΡ…ΠΎΠΆΠ΅, срабатываСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, Π²Π΅Ρ€Π½ΠΎ? Π½ΠΎ Ρ‡Ρ‚ΠΎ, Ссли я Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ это свойство для Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π°? Ρ‚ΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, поэтому didUpdate Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½. πŸ€”

Π’Π°ΠΊΠΆΠ΅ didInsertElement Π²Ρ‹Π΄Π°Π΅Ρ‚ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² Glimmer, Ссли ΠΌΡ‹ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ устанавливаСм ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΡƒΡŽ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ.

@ Turbo87 ΠœΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ прСдставлСниС ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° didUpdate . Π­Ρ‚Π° Π»ΠΎΠ²ΡƒΡˆΠΊΠ° вызываСтся, ΠΊΠΎΠ³Π΄Π° отслСТиваСмоС свойство, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ Π² шаблонС _ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚_ измСняСтся. Π‘ΠΌ. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: http://tinyurl.com/y7osxpy2. Когда Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² didUpdate Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ «использовал» этот Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚.

@ Gaurav0 Π’Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π²ΠΈΠ³Π°Π΅Ρ‚Π΅ стойки Π²ΠΎΡ€ΠΎΡ‚. ;) Π’Π°Ρˆ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ запускал запрос ajax Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ Π±Ρ‹ ΠΊ возникновСнию ошибки, Ссли Π±Ρ‹ это ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Π² didInsertElement . Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ синхронно ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ свойство Π² ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ врСмя, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π»Π΅Π½ΠΈΠ²Ρ‹Ρ… Π³Π΅Ρ‚Ρ‚Π΅Ρ€ΠΎΠ². НапримСр, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ свойство асинхронно послС ajax, это Π½Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅ событий.

Ρ…ΠΎΡ€ΠΎΡˆΠΎ, для мСня этого достаточно. Π’ любом случаС я Π½Π΅ Ρ…ΠΎΡ‚Π΅Π» ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π° этой ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π²Π΅Ρ‰ΠΈ, просто Ρ…ΠΎΡ‚Π΅Π» ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ руководства ΠΏΠΎ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ :)

@tomdale это всС Π΅Ρ‰Π΅ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ? Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя каТСтся Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ.

@tomdale Π₯ΠΎΡ€ΠΎΡˆΠΎ, сцСнарий Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ запрос ajax, ΠΊΠΎΠ³Π΄Π° измСнился ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ этот Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚. ΠœΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Ρ. МоТСм Π»ΠΈ ΠΌΡ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π² didInsertElement?

@ Gaurav0 Π§Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°? БлСдуя DDAU, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ любой ΠΊΠΎΠ΄, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°, Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π·Π° запуск запроса AJAX.

Атрибут мСняСтся ΠΎΡ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° / ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°. DDAU.

@ Gaurav0 @tomdale Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ этого инструмСнты ember-leaflet / didReceiveAttrs ΠΈΠ»ΠΈ observer . Как Π±Ρ‹ / ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ?

@nickschot Π”ΡƒΠΌΠ°ΡŽ, я ember-leaflet .

Если Π²Ρ‹ ΠΏΠΎΠΊΠΎΠΏΠ°Π΅Ρ‚Π΅ΡΡŒ Π² ember-leaflet / ember-composability-tools , Π²Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ didReceiveAttrs ΠΈΠ»ΠΈ didUpdate ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Ρ…ΡƒΠΊΠΈ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ этому . На самом Π΄Π΅Π»Π΅ Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ…ΡƒΠΊΠΈ init ΠΈ willDestroy , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ / ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ Π½Π° своих родитСлях (ΠΈ, Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅, Π½Π° ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π°). Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ…ΡƒΠΊΠΎΠ² constructor ΠΈ willDestroy Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… Glimmer. ΠšΠΎΡ€Π½Π΅Π²ΠΎΠΉ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ _Π΄ΠΎΠ»ΠΆΠ΅Π½_ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ didInsertElement , Π½ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° {{did-insert}} .

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ {{did-insert}} / {{did-update}} для отраТСния любого количСства Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π² элСмСнтах DOM. Они ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ автоматичСски, поэтому использованиС значСния Π² Π½ΠΈΡ… ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΈΡ… ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌΡƒ запуску, Ссли значСния измСнятся. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ свои собствСнныС ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, ΠΈ ΠΎΠ½ΠΈ Ρ‚ΠΎΠΆΠ΅ смогут это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.

Π•ΡΡ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ стСпСни связан, Ρ‡Ρ‚ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ Glimmer - Β«Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π°Β», ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ этому, Π² Π°Π΄Π΄ΠΎΠ½Π΅ ember-google-maps . Π­Ρ‚ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ встрСчаСтся Π³ΠΎΡ€Π°Π·Π΄ΠΎ Ρ€Π΅ΠΆΠ΅ (ΠΌΡ‹ нашли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ использованиС), ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π»ΠΈΠ±ΠΎ Ρ‡Π΅Ρ€Π΅Π· MutationObserver для наблюдСния Π·Π° DOM, ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· диспСтчСр настраиваСмых ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ запуска ΠΊΡ€ΡŽΡ‡ΠΊΠΈ didUpdate / didRender . Π― Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния <RenderDetector> Π±Ρ‹Π» Π±Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ способом ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ со всСми этими Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°ΠΌΠΈ использования, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π» Π±Ρ‹ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ Π² ΠΎΠ΄Π½ΠΎΠΌ, Π»Π΅Π³ΠΊΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅.

@pzuraq это Π±Ρ‹Π»ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя, Π½ΠΎ нСбольшоС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π² этой области. Π’ ΠΌΠΎΠ΅ΠΌ случаС я Π½Π΅ ΠΌΠΎΠ³Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² этих ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅Ρ‚ DOM. Π’ настоящСС врСмя я Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π» диспСтчСр настраиваСмых ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² с сСмантикой glimmer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π»ΠΎΠ²ΡƒΡˆΠΊΡƒ didUpdate.

@nickschot, ΠΌΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠ°. ΠŸΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ useEffect Π² React, Ссли Π²Ρ‹ Π·Π½Π°ΠΊΠΎΠΌΡ‹ (Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ большС ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° useLayoutEffect ).

Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ API Π½Π° основС классов нуТдаСтся Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠ΅, Π² ΠΈΠ΄Π΅Π°Π»Π΅ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ API-интСрфСйсу ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, я Π΄ΡƒΠΌΠ°ΡŽ (плюс Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ввСсти Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ), Π½ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ API Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π°Ρ‚ΡŒ Π²Π°ΠΌ всС способности, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для достиТСния Π»ΡŽΠ±Ρ‹Ρ… ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹.

@pzuraq Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚? НуТно Π»ΠΈ Π½Π°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ собствСнный ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ любой ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ?

Бинтаксис Ρ‚Π°ΠΊΠΎΠΉ?

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

Π­Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π° Π½Π΅ Π½Π° Β«ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅Β».

Или Π²Ρ‹ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΈ вмСсто ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²? Π§Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅:

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

Если Π΄Π°, размСститС ссылки Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹. Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ общСдоступный API ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠ° класса ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ compute ΠΈ recompute , Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΎ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°.

Π˜Π·Π²ΠΈΠ½ΠΈΡ‚Π΅, поТалуйста, Π·Π° Π³Π»ΡƒΠΏΡ‹Π΅ вопросы, Π½ΠΎ для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Ember этот вопрос довольно Π·Π°Π³Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΉ, докумСнтация отсутствуСт ΠΈ Ρ€Π°Π·Ρ€ΠΎΠ·Π½Π΅Π½Π°.

Или Π²Ρ‹ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΈ вмСсто ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²?

Π‘ΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π²Π΅Ρ€Π½ΠΎ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ этого, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ember-render-helpers , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚ @ember/render-modifiers API.

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, compute запускаСтся ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠ° Π² шаблон / вычисляСтся ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ запускаСтся ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ любого ΠΈΠ· Π΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Он Ρ‚Π°ΠΊΠΆΠ΅ автоматичСски отслСТиваСт Π² 3.13+.

Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ {{did-insert}} , Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ:

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

И Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΉΡ‚Π΅ΡΡŒ, я понимаю, Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΎΡ‡Π°Ρ€ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ ΠΈ Π·Π°Π³Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΌ. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π½Π° ΠΏΠ΅Ρ€Π΅Π΄ΠΎΠ²ΠΎΠΉ / ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½ΠΎΠΉ сторонС Π²Π΅Ρ‰Π΅ΠΉ, ΠΌΡ‹ Π΅Ρ‰Π΅ Π½Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ всС Π½ΠΎΠ²Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, ΠΈ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ Π½Π°Π΄ этим πŸ™‚

Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Octane отсутствуСт πŸ˜„

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ