Ember.js: # 각 λ‹€μ‹œ λ Œλ”λ§ 버그

에 λ§Œλ“  2018λ…„ 09μ›” 14일  Β·  8μ½”λ©˜νŠΈ  Β·  좜처: emberjs/ember.js

ν™•μΈλž€ λͺ©λ‘μœΌλ‘œ λ Œλ”λ§ν•˜λŠ” true / false / undefined κ°’μ˜ 배열이 μžˆμŠ΅λ‹ˆλ‹€.
λ°°μ—΄ μš”μ†Œλ₯Ό true둜 λ˜λŠ” trueμ—μ„œ λ³€κ²½ν•  λ•Œ ν™•μΈλž€ λͺ©λ‘μ€ λ³€κ²½λœ ν™•μΈλž€κ³Ό ν•¨κ»˜ λ³€κ²½ 사항을 μƒμ†ν•˜λŠ” λ‹€μŒ (index + 1) ν™•μΈλž€μœΌλ‘œ λ‹€μ‹œ λ Œλ”λ§λ©λ‹ˆλ‹€.
μ•”ν˜Έ:

{{#each range as |value idx|}}
  <label><input type="checkbox" checked={{value}} {{action makeChange idx on="change"}}>{{idx}}: {{value}}</label><br/>
{{/each}}

{{#each range key="@index" as |value idx|}} ν•˜λ©΄ μ œλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

νŠΈμœ„λ“€ : https://ember-twiddle.com/6d63548f35f99da19cee9f58fb64db59

embereach

Bug Has Reproduction Rendering

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ‚˜λŠ” μ—¬κΈ°μ„œ 무슨 일이 μΌμ–΄λ‚˜κ³  μžˆλŠ”μ§€ μ•Œκ³  μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μ—‰λ§μ΄μ§€λ§Œ μ„€λͺ…ν•˜λ €κ³  λ…Έλ ₯ν•  κ²ƒμž…λ‹ˆλ‹€. λ§Žμ€ 엣지 μΌ€μ΄μŠ€ (ν…Œλ‘λ¦¬ 라인 μ‚¬μš©μž 였λ₯˜)가이 λ¬Έμ œμ— κΈ°μ—¬ν–ˆμœΌλ©° 버그가 무엇인지, 버그가 μ•„λ‹Œμ§€, 무엇을 μ–΄λ–»κ²Œ μˆ˜μ •ν•΄μ•Όν•˜λŠ”μ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

μ£Όμš” πŸ”‘

λ¨Όμ € {{#each}} μ—μ„œ key 맀개 λ³€μˆ˜κ°€ μˆ˜ν–‰ν•˜λŠ” μž‘μ—…μ„ μ„€λͺ…ν•΄μ•Όν•©λ‹ˆλ‹€. μš”μ•½ν•˜μžλ©΄, DOM을 μ²˜μŒλΆ€ν„° λ§Œλ“œλŠ” 것이 μ•„λ‹ˆλΌ κΈ°μ‘΄ DOM을 μž¬μ‚¬μš©ν•˜λŠ” 것이 합리적 일지 μ—¬λΆ€μ™€μ‹œκΈ°λ₯Ό κ²°μ •ν•˜λ €κ³ ν•©λ‹ˆλ‹€.

우리의 λͺ©μ μ„ μœ„ν•΄ "DOM ν„°μΉ˜"(예 : ν…μŠ€νŠΈ λ…Έλ“œ, μ†μ„±μ˜ λ‚΄μš© μ—…λ°μ΄νŠΈ, λ‚΄μš© μΆ”κ°€ λ˜λŠ” 제거 λ“±)λŠ” λΉ„μš©μ΄ 많이 λ“€κ³  κ°€λŠ₯ν•œ ν•œ ν”Όν•΄μ•Όν•œλ‹€λŠ” 점을 λ°›μ•„ λ“€μ—¬ λ΄…μ‹œλ‹€.

λ‹€μ†Œ κ°„λ‹¨ν•œ ν…œν”Œλ¦Ώμ— 집쀑 ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

<ul>
  {{#each this.names as |name|}}
    <li>{{name.first}} {{to-upper-case name.last}}</li>
  {{/each}}
</ul>

this.names κ°€ ...

[
  { first: "Yehuda", last: "Katz" },
  { first: "Tom", last: "Dale" },
  { first: "Godfrey", last: "Chan" }
]

그럼 당신은 얻을 κ²ƒμž…λ‹ˆλ‹€ ...

<ul>
  <li>Yehuda KATZ</li>
  <li>Tom DALE</li>
  <li>Godfrey CHAN</li>
</ul>

μ—¬νƒœκΉŒμ§€λŠ” κ·ΈλŸ°λŒ€λ‘œ μž˜λλ‹€.

λͺ©λ‘μ— ν•­λͺ© μΆ”κ°€

이제 λͺ©λ‘μ— { first: "Andrew", last: "Timberlake" } λ₯Ό μΆ”κ°€ν•˜λ©΄ μ–΄λ–¨κΉŒμš”? ν…œν”Œλ¦Ώμ΄ λ‹€μŒ DOM을 생성 ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒν•©λ‹ˆλ‹€.

<ul>
  <li>Yehuda KATZ</li>
  <li>Tom DALE</li>
  <li>Godfrey CHAN</li>
  <li>Andrew TIMBERLAKE</li>
</ul>

ν•˜μ§€λ§Œ _how_?

{{#each}} λ„μš°λ―Έλ₯Ό κ΅¬ν˜„ν•˜λŠ” κ°€μž₯ μˆœμ§„ν•œ 방법은 λͺ©λ‘μ˜ λ‚΄μš©μ΄ λ³€κ²½ 될 λ•Œλ§ˆλ‹€ λͺ©λ‘μ˜ λͺ¨λ“  λ‚΄μš©μ„ μ§€μš°λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λ ‡κ²Œν•˜λ €λ©΄ _ μ΅œμ†Œν•œ _ 23 개의 μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ•Όν•©λ‹ˆλ‹€.

  • <li> λ…Έλ“œ 3 개 제거
  • <li> λ…Έλ“œ 4 개 μ‚½μž…
  • 12 개의 ν…μŠ€νŠΈ λ…Έλ“œλ₯Ό μ‚½μž…ν•©λ‹ˆλ‹€ (이름에 1 개, 사이 곡백에 1 개,성에 1 개, 4 ν–‰ κ³±ν•˜κΈ°)
  • to-upper-case λ„μš°λ―Έλ₯Ό 4 번 ν˜ΈμΆœν•©λ‹ˆλ‹€.

이것은 ... 맀우 λΆˆν•„μš”ν•˜κ³  λΉ„μ‹Έ λ³΄μž…λ‹ˆλ‹€. 처음 μ„Έ ν•­λͺ©μ€ λ³€κ²½λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ ν•΄λ‹Ή 행에 λŒ€ν•œ μž‘μ—…μ„ κ±΄λ„ˆ λ›Έ 수 있으면 쒋을 κ²ƒμž…λ‹ˆλ‹€.

πŸ”‘ @index

더 λ‚˜μ€ κ΅¬ν˜„μ€ κΈ°μ‘΄ 행을 μž¬μ‚¬μš©ν•˜κ³  λΆˆν•„μš”ν•œ μ—…λ°μ΄νŠΈλ₯Ό μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ” κ²ƒμž…λ‹ˆλ‹€. ν•œ 가지 μ•„μ΄λ””μ–΄λŠ” λ‹¨μˆœνžˆ 행을 ν…œν”Œλ¦Ώμ˜ μœ„μΉ˜μ™€ μΌμΉ˜μ‹œν‚€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이것은 본질적으둜 key="@index" μ—­ν• μž…λ‹ˆλ‹€.

  1. 첫 번째 개체 { first: "Yehuda", last: "Katz" } 와 첫 번째 ν–‰ <li>Yehuda KATZ</li> :
    1.1. "Yehuda"=== "Yehuda", ν•  일 μ—†μŒ
    1.2. (곡간에 동적 데이터가 ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ―€λ‘œ 비ꡐ가 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.)
    1.3. "Katz"=== "Katz", ν—¬νΌλŠ” "순수"μ΄λ―€λ‘œ to-upper-case 헬퍼λ₯Ό λ‹€μ‹œ 호좜 ν•  ν•„μš”κ°€ μ—†μŒμ„ μ•Œκ³  μžˆμœΌλ―€λ‘œ ν•΄λ‹Ή ν—¬νΌμ˜ 좜λ ₯을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€ ( "KATZ" ) _also_ λ³€κ²½λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ μ—¬κΈ°μ„œ ν•  일이 μ—†μŠ΅λ‹ˆλ‹€.
  2. λ§ˆμ°¬κ°€μ§€λ‘œ, ν–‰ 2와 3에 λŒ€ν•΄ ν•  일이 μ—†μŠ΅λ‹ˆλ‹€
  3. DOMμ—λŠ” λ„€ 번째 행이 μ—†μœΌλ―€λ‘œ μƒˆ 행을 μ‚½μž…ν•˜μ‹­μ‹œμ˜€.
    3.1. <li> λ…Έλ“œ μ‚½μž…
    3.2. ν…μŠ€νŠΈ λ…Έλ“œ ( "Andrew") μ‚½μž…
    3.3. ν…μŠ€νŠΈ λ…Έλ“œ (곡백) μ‚½μž…
    3.4. to-upper-case λ„μš°λ―Έ 호좜 ( "Timberlake"-> "TIMBERLAKE")
    3.5. ν…μŠ€νŠΈ λ…Έλ“œ ( "TIMBERLAKE") μ‚½μž…

λ”°λΌμ„œμ΄ κ΅¬ν˜„μ„ 톡해 총 μž‘μ—… 수λ₯Ό 23 κ°œμ—μ„œ 5 개둜 μ€„μ˜€μŠ΅λ‹ˆλ‹€. λ‚˜μ˜μ§€ μ•Šλ‹€.

λͺ©λ‘μ— ν•­λͺ© μΆ”κ°€

ν•˜μ§€λ§Œ 이제 λͺ©λ‘μ— _appending_ { first: "Andrew", last: "Timberlake" } λŒ€μ‹  _prepended_ν•˜λ©΄ μ–΄λ–»κ²Œ λ κΉŒμš”? ν…œν”Œλ¦Ώμ΄ λ‹€μŒ DOM을 생성 ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒν•©λ‹ˆλ‹€.

<ul>
  <li>Andrew TIMBERLAKE</li>
  <li>Yehuda KATZ</li>
  <li>Tom DALE</li>
  <li>Godfrey CHAN</li>
</ul>

ν•˜μ§€λ§Œ _how_?

  1. 첫 번째 개체 { first: "Andrew", last: "Timberlake" } λ₯Ό 첫 번째 ν–‰ <li>Yehuda KATZ</li> .
    1.1. "Andrew"! == "Yehuda", ν…μŠ€νŠΈ λ…Έλ“œ μ—…λ°μ΄νŠΈ
    1.2. (곡간에 동적 데이터가 ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ―€λ‘œ 비ꡐ가 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.)
    1.3. "Timberlake"! == "Katz", to-upper-case λ„μš°λ―Έ λ‹€μ‹œ 호좜
    1.4. "KATZ"μ—μ„œ "TIMBERLAKE"둜 ν…μŠ€νŠΈ λ…Έλ“œ μ—…λ°μ΄νŠΈ
  2. 두 번째 개체 { first: "Yehuda", last: "Katz" } λ₯Ό 두 번째 ν–‰ <li>Tom DALE</li> , λ‹€λ₯Έ 3 개 μž‘μ—…κ³Ό λΉ„κ΅ν•©λ‹ˆλ‹€.
  3. 두 번째 개체 { first: "Tom", last: "Dale" } λ₯Ό 두 번째 ν–‰ <li>Godfrey CHAN</li> , λ‹€λ₯Έ 3 개 μž‘μ—…κ³Ό λΉ„κ΅ν•©λ‹ˆλ‹€.
  4. DOMμ—λŠ” λ„€ 번째 행이 μ—†μœΌλ―€λ‘œ μƒˆ 행을 μ‚½μž…ν•˜μ‹­μ‹œμ˜€.
    3.1. <li> λ…Έλ“œ μ‚½μž…
    3.2. ν…μŠ€νŠΈ λ…Έλ“œ ( "Godfrey") μ‚½μž…
    3.3. ν…μŠ€νŠΈ λ…Έλ“œ (곡백) μ‚½μž…
    3.4. to-upper-case λ„μš°λ―Έ 호좜 ( "Chan"-> "CHAN")
    3.5. ν…μŠ€νŠΈ λ…Έλ“œ ( "CHAN") μ‚½μž…

그것은 14 개의 μž‘μ—…μž…λ‹ˆλ‹€. μ•„μ•Ό!

πŸ”‘ @identity

κ°œλ…μ μœΌλ‘œ μš°λ¦¬κ°€ μ ‘ 두든 μΆ”κ°€ν•˜λ“ , μš°λ¦¬λŠ” μ—¬μ „νžˆ λ°°μ—΄μ˜ 단일 객체 만 λ³€κ²½ (μ‚½μž…)ν•˜κ³  있기 λ•Œλ¬Έμ— λΆˆν•„μš” ν•΄ λ³΄μ˜€μŠ΅λ‹ˆλ‹€. 졜적으둜, μš°λ¦¬λŠ” μΆ”κ°€ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œν–ˆλ˜ κ²ƒμ²˜λŸΌμ΄ μΌ€μ΄μŠ€λ₯Ό 처리 ν•  수 β€‹β€‹μžˆμ–΄μ•Όν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ key="@identity" κ°€ λ“€μ–΄μ˜΅λ‹ˆλ‹€. λ°°μ—΄μ—μžˆλŠ” μš”μ†Œμ˜ _order_에 μ˜μ‘΄ν•˜λŠ” λŒ€μ‹  JavaScript 개체 ID ( === )λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

  1. 데이터가 첫 번째 개체 { first: "Andrew", last: "Timberlake" } 와 μΌμΉ˜ν•˜λŠ” ( === ) κΈ°μ‘΄ 행을 μ°ΎμŠ΅λ‹ˆλ‹€. 아무것도 λ°œκ²¬λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ μƒˆ 행을 μ‚½μž… (μ•žμ— μΆ”κ°€)ν•©λ‹ˆλ‹€.
    1.1. <li> λ…Έλ“œ μ‚½μž…
    1.2. ν…μŠ€νŠΈ λ…Έλ“œ ( "Andrew") μ‚½μž…
    1.3. ν…μŠ€νŠΈ λ…Έλ“œ (곡백) μ‚½μž…
    1.4. to-upper-case λ„μš°λ―Έ 호좜 ( "Timberlake"-> "TIMBERLAKE")
    1.5. ν…μŠ€νŠΈ λ…Έλ“œ ( "TIMBERLAKE") μ‚½μž…
  2. 데이터가 두 번째 개체 { first: "Yehuda", last: "Katz" } 와 μΌμΉ˜ν•˜λŠ” ( === ) κΈ°μ‘΄ 행을 μ°ΎμŠ΅λ‹ˆλ‹€. <li>Yehuda KATZ</li> 발견 :
    2.1. "Yehuda"=== "Yehuda", ν•  일 μ—†μŒ
    2.2. (곡간에 동적 데이터가 ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ―€λ‘œ 비ꡐ가 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.)
    2.3. "Katz"=== "Katz", ν—¬νΌλŠ” "순수"μ΄λ―€λ‘œ to-upper-case 헬퍼λ₯Ό λ‹€μ‹œ 호좜 ν•  ν•„μš”κ°€ μ—†μŒμ„ μ•Œκ³  μžˆμœΌλ―€λ‘œ ν•΄λ‹Ή ν—¬νΌμ˜ 좜λ ₯을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€ ( "KATZ" ) _also_ λ³€κ²½λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ μ—¬κΈ°μ„œ ν•  일이 μ—†μŠ΅λ‹ˆλ‹€.
  3. λ§ˆμ°¬κ°€μ§€λ‘œ Tomκ³Ό Godfrey의 ν–‰μ—λŠ” ν•  일이 μ—†μŠ΅λ‹ˆλ‹€.
  4. μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” κ°œμ²΄κ°€μžˆλŠ” λͺ¨λ“  행을 μ œκ±°ν•©λ‹ˆλ‹€ (μ—†μŒ,이 경우 μˆ˜ν–‰ ν•  μž‘μ—… μ—†μŒ).

이λ₯Ό 톡해 졜적의 5 가지 μž‘μ—…μœΌλ‘œ λŒμ•„κ°‘λ‹ˆλ‹€.

ν™•μž₯

λ‹€μ‹œ λ§ν•˜μ§€λ§Œ 이것은 비ꡐ와 λΆ€κΈ° λΉ„μš©μ— 손을 ν”λ“œλŠ” κ²ƒμž…λ‹ˆλ‹€. 사싀, 그것듀도 λ¬΄λ£Œκ°€ μ•„λ‹ˆλ©°,이 μ•„μ£Ό κ°„λ‹¨ν•œ μ˜ˆμ—μ„œλŠ” κ·Έλ§Œν•œ κ°€μΉ˜κ°€ 없을 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λͺ©λ‘μ΄ 크고 각 행이 λ³΅μž‘ν•œ ꡬ성 μš”μ†Œ (λ§Žμ€ λ„μš°λ―Έ, 계산 된 속성, ν•˜μœ„ ꡬ성 μš”μ†Œ λ“±)λ₯Ό ν˜ΈμΆœν•œλ‹€κ³  μƒμƒν•΄λ³΄μ‹­μ‹œμ˜€. 예λ₯Ό λ“€μ–΄ LinkedIn λ‰΄μŠ€ ν”Όλ“œλ₯Ό μƒμƒν•΄λ³΄μ‹­μ‹œμ˜€. μ˜¬λ°”λ₯Έ 행을 μ˜¬λ°”λ₯Έ 데이터와 μΌμΉ˜μ‹œν‚€μ§€ μ•ŠμœΌλ©΄ ꡬ성 μš”μ†Œμ˜ μΈμˆ˜κ°€ 잠재적으둜 많이 변동될 수 있으며 μ˜ˆμƒλ³΄λ‹€ 훨씬 λ§Žμ€ DOM μ—…λ°μ΄νŠΈκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 잘λͺ»λœ DOM μš”μ†Œλ₯Ό μΌμΉ˜μ‹œν‚€κ³  μ»€μ„œ μœ„μΉ˜ 및 ν…μŠ€νŠΈ 선택 μƒνƒœμ™€ 같은 DOM μƒνƒœλ₯Ό μžƒλŠ” λ¬Έμ œλ„ μžˆμŠ΅λ‹ˆλ‹€.

μ „λ°˜μ μœΌλ‘œ μΆ”κ°€ 비ꡐ 및 ​​뢀기 λΉ„μš©μ€ μ‹€μ œ μ•±μ—μ„œ λŒ€λΆ€λΆ„μ˜ μ‹œκ°„ λ™μ•ˆ μ‰½κ²Œ κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. Ember의 기본값은 key="@identity" 이고 거의 λͺ¨λ“  κ²½μš°μ— 잘 μž‘λ™ν•˜κΈ° λ•Œλ¬Έμ— 일반적으둜 {{#each}} μ‚¬μš©ν•  λ•Œ key 인수 섀정에 λŒ€ν•΄ κ±±μ •ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

좩돌 πŸ’₯

ν•˜μ§€λ§Œ 잠깐, λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이 사건은 μ–΄λ–»μŠ΅λ‹ˆκΉŒ?

const YEHUDA = { first: "Yehuda", last: "Katz" };
const TOM = { first: "Tom", last: "Dale" };
const GODFREY = { first: "Godfrey", last: "Chan" };

this.list = [
  YEHUDA,
  TOM,
  GODFREY,
  TOM, // duplicate
  YEHUDA, // duplicate
  YEHUDA, // duplicate
  YEHUDA // duplicate
];

μ—¬κΈ°μ„œ λ¬Έμ œλŠ” λ™μΌν•œ 객체가 λ™μΌν•œ λͺ©λ‘μ— μ—¬λŸ¬ 번 λ‚˜νƒ€λ‚  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이것은 μˆœμ§„ν•œ @identity μ•Œκ³ λ¦¬μ¦˜, 특히 "데이터가 μΌμΉ˜ν•˜λŠ” κΈ°μ‘΄ ν–‰ μ°ΎκΈ° ( === ) ..."라고 λ§ν•œ 뢀뢄을 κΉ¨λœ¨λ¦½λ‹ˆλ‹€. μ΄λŠ” 데이터와 DOM 관계가 1 인 κ²½μš°μ—λ§Œ μž‘λ™ν•©λ‹ˆλ‹€. : 1,이 κ²½μš°μ—λŠ” 사싀이 μ•„λ‹™λ‹ˆλ‹€. 이것은 μ‹€μ œλ‘œλŠ” λΆˆκ°€λŠ₯ ν•΄ 보일 수 μžˆμ§€λ§Œ ν”„λ ˆμž„ μ›Œν¬λ‘œμ„œ μš°λ¦¬λŠ” 그것을 μ²˜λ¦¬ν•΄μ•Όν•©λ‹ˆλ‹€.

이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ μΌμ’…μ˜ ν•˜μ΄λΈŒλ¦¬λ“œ μ ‘κ·Ό 방식을 μ‚¬μš©ν•˜μ—¬ μ΄λŸ¬ν•œ μΆ©λŒμ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€. λ‚΄λΆ€μ μœΌλ‘œ ν‚€ -DOM 맀핑은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

"YEHUDA" => <li>Yehuda...</li>
"TOM" => <li>Tom...</li>
"GODFREY" => <li>Godfrey...</li>
"TOM-1" => <li>Tom...</li>
"YEHUDA-1" => <li>Yehuda...</li>
"YEHUDA-2" => <li>Yehuda...</li>
"YEHUDA-3" => <li>Yehuda...</li>

λŒ€λΆ€λΆ„μ˜ 경우, 이것은 맀우 λ“œλ¬Όκ³ , 그것이 λ‚˜μ˜€λ©΄ λŒ€λΆ€λΆ„μ˜ 경우 Good Enough β„’μ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€. μ–΄λ–€ 이유둜이 방법이 μž‘λ™ν•˜μ§€ μ•ŠλŠ” 경우 항상 ν‚€ 경둜 (λ˜λŠ” RFC 321의 κ³ κΈ‰ ν‚€ 지정 λ©”μ»€λ‹ˆμ¦˜)λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

"πŸ›"으둜 λŒμ•„ κ°€κΈ°

λͺ¨λ“  λŒ€ν™”κ°€ λλ‚˜λ©΄ 이제 Twiddleμ—μ„œ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μ‚΄νŽ΄λ³Ό μ€€λΉ„κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

기본적으둜 [undefined, undefined, undefined, undefined, undefined] λͺ©λ‘μœΌλ‘œ μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€.

κ΄€λ ¨μ—†λŠ” λ©”λͺ¨ : Array(5) λŠ” [undefined, undefined, undefined, undefined, undefined] 와 λ™μΌν•˜μ§€ _ μ•„λ‹™λ‹ˆλ‹€ _. 일반적으둜 ν”Όν•΄μ•Όν•˜λŠ” "홀리 μ–΄λ ˆμ΄"λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ "ꡬ멍"에 μ•‘μ„ΈμŠ€ ν•  λ•Œ μ‹€μ œλ‘œ undefined 돌렀 λ°›κΈ° λ•Œλ¬Έμ—μ΄ 버그와 관련이 μ—†μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ 우리의 _ 맀우 쒁은 _ λͺ©μ μ„ μœ„ν•΄μ„œλ§Œ, 그것듀은 λ™μΌν•©λ‹ˆλ‹€.

ν‚€λ₯Ό μ§€μ •ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— EmberλŠ” 기본적으둜 @identity λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. λ˜ν•œ 좩돌이기 λ•Œλ¬Έμ— λ‹€μŒκ³Ό 같은 κ²°κ³Όλ₯Ό μ–»μ—ˆμŠ΅λ‹ˆλ‹€.

"undefined" => <input ...> 0: ...,
"undefined-1" => <input ...> 1: ...,
"undefined-2" => <input ...> 2: ...,
"undefined-3" => <input ...> 3: ...,
"undefined-4" => <input ...> 4: ...

이제 첫 번째 ν™•μΈλž€μ„ ν΄λ¦­ν•œλ‹€κ³  κ°€μ • ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

  1. 선택 μƒμžμ˜ κΈ°λ³Έ λ™μž‘μ„ νŠΈλ¦¬κ±°ν•©λ‹ˆλ‹€. 선택 μƒνƒœλ₯Ό true둜 λ³€κ²½ν•©λ‹ˆλ‹€.
  2. {{action}} μˆ˜μ • μžμ— μ˜ν•΄ μ°¨λ‹¨λ˜κ³  makeChange λ©”μ†Œλ“œλ‘œ λ‹€μ‹œ μ „λ‹¬λ˜λŠ” 클릭 이벀트λ₯Ό νŠΈλ¦¬κ±°ν•©λ‹ˆλ‹€.
  3. λͺ©λ‘μ„ [true, undefined, undefined, undefined, undefined] λ³€κ²½ν•©λ‹ˆλ‹€.
  4. DOM을 μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.

DOM은 μ–΄λ–»κ²Œ μ—…λ°μ΄νŠΈλ©λ‹ˆκΉŒ?

  1. 데이터가 첫 번째 개체 true 와 μΌμΉ˜ν•˜λŠ” ( === ) κΈ°μ‘΄ 행을 μ°ΎμŠ΅λ‹ˆλ‹€. 아무것도 λ°œκ²¬λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ μƒˆ ν–‰ <input checked=true ...>0: true... μ‚½μž… (μ•žμ— μΆ”κ°€)
  2. 데이터가 두 번째 개체 undefined 와 μΌμΉ˜ν•˜λŠ” ( === ) κΈ°μ‘΄ 행을 μ°ΎμŠ΅λ‹ˆλ‹€. <input ...>0: ... 발견 (μ΄μ „μ˜ 첫 번째 ν–‰) :
    2.1. {{idx}} ν…μŠ€νŠΈ λ…Έλ“œλ₯Ό 1
    2.2. 그렇지 μ•ŠμœΌλ©΄, Emberκ°€ 말할 μˆ˜μžˆλŠ” ν•œ,이 ν–‰μ—μ„œ λ‹€λ₯Έ 것은 아무것도 λ³€κ²½λ˜μ§€ μ•Šμ•˜μœΌλ©° λ‹€λ₯Έ ν•  일도 μ—†μŠ΅λ‹ˆλ‹€.
  3. 데이터가 μ„Έ 번째 개체 undefined 와 μΌμΉ˜ν•˜λŠ” ( === ) κΈ°μ‘΄ 행을 μ°ΎμŠ΅λ‹ˆλ‹€. undefined 두 번째둜 λ³΄μ•˜μœΌλ―€λ‘œ λ‚΄λΆ€ ν‚€λŠ” undefined-1 μ΄λ―€λ‘œ <input ...>1: ... (μ΄μ „μ˜ SECOND ν–‰)을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.
    3.1. {{idx}} ν…μŠ€νŠΈ λ…Έλ“œλ₯Ό 2
    3.2. 그렇지 μ•ŠμœΌλ©΄, Emberκ°€ 말할 μˆ˜μžˆλŠ” ν•œ,이 ν–‰μ—μ„œ λ‹€λ₯Έ 것은 아무것도 λ³€κ²½λ˜μ§€ μ•Šμ•˜μœΌλ©° λ‹€λ₯Έ ν•  일도 μ—†μŠ΅λ‹ˆλ‹€.
  4. λ§ˆμ°¬κ°€μ§€λ‘œ undefined-2 및 undefined-3
  5. λ§ˆμ§€λ§‰μœΌλ‘œ, μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” undefined-4 행을 μ œκ±°ν•©λ‹ˆλ‹€ (μ—…λ°μ΄νŠΈ ν›„ 배열에 undefined κ°€ ν•˜λ‚˜ 더 μ μœΌλ―€λ‘œ).

κ·Έλž˜μ„œ 이것은 μš°λ¦¬κ°€ νŠΈμœ„λ“€μ—μ„œ 얻은 κ²°κ³Όλ₯Ό μ–΄λ–»κ²Œ μ–»μ—ˆλŠ”μ§€ μ„€λͺ…ν•©λ‹ˆλ‹€. 기본적으둜 λͺ¨λ“  DOM 행이 ν•˜λ‚˜μ”© μ•„λž˜λ‘œ μ΄λ™ν•˜κ³  μƒˆ 행이 맨 μœ„μ— μ‚½μž…λ˜κ³  {{idx}} κ°€ λ‚˜λ¨Έμ§€ 행에 λŒ€ν•΄ μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€.

정말 μ˜ˆμƒμΉ˜ λͺ»ν•œ 뢀뢄은 2.2μž…λ‹ˆλ‹€. 첫 번째 ν™•μΈλž€ (클릭 ν•œ ν™•μΈλž€)이 ν•œ ν–‰μ”© μ•„λž˜λ‘œ μ΄λ™ν•˜μ—¬ 두 번째 μœ„μΉ˜λ‘œ μ΄λ™ν–ˆμ§€λ§Œ, Ember의 checked 속성이 true λ³€κ²½ 될 κ²ƒμœΌλ‘œ μ˜ˆμƒν–ˆμ„ κ²ƒμž…λ‹ˆλ‹€. λ°”μš΄λ“œ 값이 μ •μ˜λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— Emberκ°€ λ‹€μ‹œ false 둜 λ³€κ²½ν•˜μ—¬ 체크λ₯Ό ν•΄μ œ ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 이것은 μž‘λ™ 방식이 μ•„λ‹™λ‹ˆλ‹€. μ²˜μŒμ— μ–ΈκΈ‰ν–ˆλ“―μ΄ DOM에 μ•‘μ„ΈμŠ€ν•˜λŠ” 것은 λΉ„μš©μ΄ 많이 λ“­λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” DOM의 _reading_이 ν¬ν•¨λ©λ‹ˆλ‹€. μ—…λ°μ΄νŠΈ ν•  λ•Œλ§ˆλ‹€ 비ꡐλ₯Ό μœ„ν•΄ DOMμ—μ„œ μ΅œμ‹  값을 μ½μ–΄μ•Όν•œλ‹€λ©΄ μ΅œμ ν™” λͺ©μ μ„ 거의 λ¬΄νš¨ν™” ν•  κ²ƒμž…λ‹ˆλ‹€. λ”°λΌμ„œμ΄λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ DOM에 κΈ°λ‘ν•œ λ§ˆμ§€λ§‰ 값을 κΈ°μ–΅ν•˜κ³  DOMμ—μ„œ λ‹€μ‹œ 읽을 ν•„μš”μ—†μ΄ ν˜„μž¬ 값을 μΊμ‹œ 된 κ°’κ³Ό λΉ„κ΅ν•©λ‹ˆλ‹€. μ°¨μ΄κ°€μžˆμ„ λ•Œλ§Œ DOM에 μƒˆ 값을 μ“°κ³  λ‹€μŒ λ²ˆμ— μΊμ‹œν•©λ‹ˆλ‹€. 이것은 μš°λ¦¬κ°€ λ™μΌν•œ "가상 DOM"μ ‘κ·Ό 방식을 κ³΅μœ ν•˜λŠ” μ˜λ―Έμ΄μ§€λ§Œ 전체 DOM의 "트리 λ‹ˆμŠ€"λ₯Ό κ°€μƒν™”ν•˜μ§€ μ•Šκ³  리프 λ…Έλ“œμ—μ„œλ§Œ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ TL; DR, checked 속성 (λ˜λŠ” ν…μŠ€νŠΈ ν•„λ“œμ˜ value 속성 λ“±)을 "바인딩"ν•˜λ©΄ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. <div>{{this.name}}</div> λ₯Ό λ Œλ”λ§ν•˜κ³  jQuery λ˜λŠ” Chrome 검사기λ₯Ό μ‚¬μš©ν•˜μ—¬ div μš”μ†Œμ˜ textContent λ₯Ό μˆ˜λ™μœΌλ‘œ μ—…λ°μ΄νŠΈ this.name λ₯Ό μ—…λ°μ΄νŠΈ ν•  κ²ƒμ΄λΌκ³ λŠ” μ˜ˆμƒν•˜μ§€ λͺ»ν–ˆμ„ κ²ƒμž…λ‹ˆλ‹€. 이것은 기본적으둜 λ™μΌν•©λ‹ˆλ‹€. checked 속성에 λŒ€ν•œ μ—…λ°μ΄νŠΈκ°€ Ember μ™ΈλΆ€μ—μ„œ λ°œμƒν–ˆκΈ° λ•Œλ¬Έμ— (ν™•μΈλž€μ— λŒ€ν•œ λΈŒλΌμš°μ €μ˜ κΈ°λ³Έ λ™μž‘μ„ 톡해) EmberλŠ” 이에 λŒ€ν•΄ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.

이것이 {{input}} λ„μš°λ―Έκ°€ μ‘΄μž¬ν•˜λŠ” μ΄μœ μž…λ‹ˆλ‹€. κ΄€λ ¨ 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό κΈ°λ³Έ HTML μš”μ†Œμ— λ“±λ‘ν•˜κ³  μž‘μ—…μ„ μ μ ˆν•œ 속성 변경에 λ°˜μ˜ν•˜μ—¬ 이해 λ‹Ήμ‚¬μž (예 : λ Œλ”λ§ λ ˆμ΄μ–΄)μ—κ²Œ μ•Œλ¦΄ 수 μžˆλ„λ‘ν•΄μ•Όν•©λ‹ˆλ‹€.

그것이 우리λ₯Ό λ– λ‚˜λŠ” 곳이 ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 이것이 μ™œ λ†€λΌμš΄ 지 μ΄ν•΄ν•˜μ§€λ§Œ 이것이 일련의 λΆˆν–‰ν•œ μ‚¬μš©μž 였λ₯˜λΌκ³  λ§ν•˜λŠ” κ²½ν–₯이 μžˆμŠ΅λ‹ˆλ‹€. μ•„λ§ˆλ„ μš°λ¦¬λŠ” μž…λ ₯ μš”μ†Œμ— μ΄λŸ¬ν•œ 속성을 λ°”μΈλ”©ν•˜λŠ” 것에 λŒ€ν•΄ λ¦°νŒ…ν•΄μ•Όν• κΉŒμš”?

λͺ¨λ“  8 λŒ“κΈ€

@andrewtimberlake λŠ” {{#each range key="@index" as |value idx|}} ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ λ²„κ·Έμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ key λŠ” λ‹€λ₯Έ λͺ©μ μ„μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€. https://www.emberjs.com/api/ember/release/classes/Ember.Templates.helpers/methods/if?anchor= λ§ˆλ‹€

λ‚˜λŠ” μ—¬κΈ°μ„œ 무슨 일이 μΌμ–΄λ‚˜κ³  μžˆλŠ”μ§€ μ•Œκ³  μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μ—‰λ§μ΄μ§€λ§Œ μ„€λͺ…ν•˜λ €κ³  λ…Έλ ₯ν•  κ²ƒμž…λ‹ˆλ‹€. λ§Žμ€ 엣지 μΌ€μ΄μŠ€ (ν…Œλ‘λ¦¬ 라인 μ‚¬μš©μž 였λ₯˜)가이 λ¬Έμ œμ— κΈ°μ—¬ν–ˆμœΌλ©° 버그가 무엇인지, 버그가 μ•„λ‹Œμ§€, 무엇을 μ–΄λ–»κ²Œ μˆ˜μ •ν•΄μ•Όν•˜λŠ”μ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

μ£Όμš” πŸ”‘

λ¨Όμ € {{#each}} μ—μ„œ key 맀개 λ³€μˆ˜κ°€ μˆ˜ν–‰ν•˜λŠ” μž‘μ—…μ„ μ„€λͺ…ν•΄μ•Όν•©λ‹ˆλ‹€. μš”μ•½ν•˜μžλ©΄, DOM을 μ²˜μŒλΆ€ν„° λ§Œλ“œλŠ” 것이 μ•„λ‹ˆλΌ κΈ°μ‘΄ DOM을 μž¬μ‚¬μš©ν•˜λŠ” 것이 합리적 일지 μ—¬λΆ€μ™€μ‹œκΈ°λ₯Ό κ²°μ •ν•˜λ €κ³ ν•©λ‹ˆλ‹€.

우리의 λͺ©μ μ„ μœ„ν•΄ "DOM ν„°μΉ˜"(예 : ν…μŠ€νŠΈ λ…Έλ“œ, μ†μ„±μ˜ λ‚΄μš© μ—…λ°μ΄νŠΈ, λ‚΄μš© μΆ”κ°€ λ˜λŠ” 제거 λ“±)λŠ” λΉ„μš©μ΄ 많이 λ“€κ³  κ°€λŠ₯ν•œ ν•œ ν”Όν•΄μ•Όν•œλ‹€λŠ” 점을 λ°›μ•„ λ“€μ—¬ λ΄…μ‹œλ‹€.

λ‹€μ†Œ κ°„λ‹¨ν•œ ν…œν”Œλ¦Ώμ— 집쀑 ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

<ul>
  {{#each this.names as |name|}}
    <li>{{name.first}} {{to-upper-case name.last}}</li>
  {{/each}}
</ul>

this.names κ°€ ...

[
  { first: "Yehuda", last: "Katz" },
  { first: "Tom", last: "Dale" },
  { first: "Godfrey", last: "Chan" }
]

그럼 당신은 얻을 κ²ƒμž…λ‹ˆλ‹€ ...

<ul>
  <li>Yehuda KATZ</li>
  <li>Tom DALE</li>
  <li>Godfrey CHAN</li>
</ul>

μ—¬νƒœκΉŒμ§€λŠ” κ·ΈλŸ°λŒ€λ‘œ μž˜λλ‹€.

λͺ©λ‘μ— ν•­λͺ© μΆ”κ°€

이제 λͺ©λ‘μ— { first: "Andrew", last: "Timberlake" } λ₯Ό μΆ”κ°€ν•˜λ©΄ μ–΄λ–¨κΉŒμš”? ν…œν”Œλ¦Ώμ΄ λ‹€μŒ DOM을 생성 ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒν•©λ‹ˆλ‹€.

<ul>
  <li>Yehuda KATZ</li>
  <li>Tom DALE</li>
  <li>Godfrey CHAN</li>
  <li>Andrew TIMBERLAKE</li>
</ul>

ν•˜μ§€λ§Œ _how_?

{{#each}} λ„μš°λ―Έλ₯Ό κ΅¬ν˜„ν•˜λŠ” κ°€μž₯ μˆœμ§„ν•œ 방법은 λͺ©λ‘μ˜ λ‚΄μš©μ΄ λ³€κ²½ 될 λ•Œλ§ˆλ‹€ λͺ©λ‘μ˜ λͺ¨λ“  λ‚΄μš©μ„ μ§€μš°λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λ ‡κ²Œν•˜λ €λ©΄ _ μ΅œμ†Œν•œ _ 23 개의 μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ•Όν•©λ‹ˆλ‹€.

  • <li> λ…Έλ“œ 3 개 제거
  • <li> λ…Έλ“œ 4 개 μ‚½μž…
  • 12 개의 ν…μŠ€νŠΈ λ…Έλ“œλ₯Ό μ‚½μž…ν•©λ‹ˆλ‹€ (이름에 1 개, 사이 곡백에 1 개,성에 1 개, 4 ν–‰ κ³±ν•˜κΈ°)
  • to-upper-case λ„μš°λ―Έλ₯Ό 4 번 ν˜ΈμΆœν•©λ‹ˆλ‹€.

이것은 ... 맀우 λΆˆν•„μš”ν•˜κ³  λΉ„μ‹Έ λ³΄μž…λ‹ˆλ‹€. 처음 μ„Έ ν•­λͺ©μ€ λ³€κ²½λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ ν•΄λ‹Ή 행에 λŒ€ν•œ μž‘μ—…μ„ κ±΄λ„ˆ λ›Έ 수 있으면 쒋을 κ²ƒμž…λ‹ˆλ‹€.

πŸ”‘ @index

더 λ‚˜μ€ κ΅¬ν˜„μ€ κΈ°μ‘΄ 행을 μž¬μ‚¬μš©ν•˜κ³  λΆˆν•„μš”ν•œ μ—…λ°μ΄νŠΈλ₯Ό μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ” κ²ƒμž…λ‹ˆλ‹€. ν•œ 가지 μ•„μ΄λ””μ–΄λŠ” λ‹¨μˆœνžˆ 행을 ν…œν”Œλ¦Ώμ˜ μœ„μΉ˜μ™€ μΌμΉ˜μ‹œν‚€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이것은 본질적으둜 key="@index" μ—­ν• μž…λ‹ˆλ‹€.

  1. 첫 번째 개체 { first: "Yehuda", last: "Katz" } 와 첫 번째 ν–‰ <li>Yehuda KATZ</li> :
    1.1. "Yehuda"=== "Yehuda", ν•  일 μ—†μŒ
    1.2. (곡간에 동적 데이터가 ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ―€λ‘œ 비ꡐ가 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.)
    1.3. "Katz"=== "Katz", ν—¬νΌλŠ” "순수"μ΄λ―€λ‘œ to-upper-case 헬퍼λ₯Ό λ‹€μ‹œ 호좜 ν•  ν•„μš”κ°€ μ—†μŒμ„ μ•Œκ³  μžˆμœΌλ―€λ‘œ ν•΄λ‹Ή ν—¬νΌμ˜ 좜λ ₯을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€ ( "KATZ" ) _also_ λ³€κ²½λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ μ—¬κΈ°μ„œ ν•  일이 μ—†μŠ΅λ‹ˆλ‹€.
  2. λ§ˆμ°¬κ°€μ§€λ‘œ, ν–‰ 2와 3에 λŒ€ν•΄ ν•  일이 μ—†μŠ΅λ‹ˆλ‹€
  3. DOMμ—λŠ” λ„€ 번째 행이 μ—†μœΌλ―€λ‘œ μƒˆ 행을 μ‚½μž…ν•˜μ‹­μ‹œμ˜€.
    3.1. <li> λ…Έλ“œ μ‚½μž…
    3.2. ν…μŠ€νŠΈ λ…Έλ“œ ( "Andrew") μ‚½μž…
    3.3. ν…μŠ€νŠΈ λ…Έλ“œ (곡백) μ‚½μž…
    3.4. to-upper-case λ„μš°λ―Έ 호좜 ( "Timberlake"-> "TIMBERLAKE")
    3.5. ν…μŠ€νŠΈ λ…Έλ“œ ( "TIMBERLAKE") μ‚½μž…

λ”°λΌμ„œμ΄ κ΅¬ν˜„μ„ 톡해 총 μž‘μ—… 수λ₯Ό 23 κ°œμ—μ„œ 5 개둜 μ€„μ˜€μŠ΅λ‹ˆλ‹€. λ‚˜μ˜μ§€ μ•Šλ‹€.

λͺ©λ‘μ— ν•­λͺ© μΆ”κ°€

ν•˜μ§€λ§Œ 이제 λͺ©λ‘μ— _appending_ { first: "Andrew", last: "Timberlake" } λŒ€μ‹  _prepended_ν•˜λ©΄ μ–΄λ–»κ²Œ λ κΉŒμš”? ν…œν”Œλ¦Ώμ΄ λ‹€μŒ DOM을 생성 ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒν•©λ‹ˆλ‹€.

<ul>
  <li>Andrew TIMBERLAKE</li>
  <li>Yehuda KATZ</li>
  <li>Tom DALE</li>
  <li>Godfrey CHAN</li>
</ul>

ν•˜μ§€λ§Œ _how_?

  1. 첫 번째 개체 { first: "Andrew", last: "Timberlake" } λ₯Ό 첫 번째 ν–‰ <li>Yehuda KATZ</li> .
    1.1. "Andrew"! == "Yehuda", ν…μŠ€νŠΈ λ…Έλ“œ μ—…λ°μ΄νŠΈ
    1.2. (곡간에 동적 데이터가 ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ―€λ‘œ 비ꡐ가 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.)
    1.3. "Timberlake"! == "Katz", to-upper-case λ„μš°λ―Έ λ‹€μ‹œ 호좜
    1.4. "KATZ"μ—μ„œ "TIMBERLAKE"둜 ν…μŠ€νŠΈ λ…Έλ“œ μ—…λ°μ΄νŠΈ
  2. 두 번째 개체 { first: "Yehuda", last: "Katz" } λ₯Ό 두 번째 ν–‰ <li>Tom DALE</li> , λ‹€λ₯Έ 3 개 μž‘μ—…κ³Ό λΉ„κ΅ν•©λ‹ˆλ‹€.
  3. 두 번째 개체 { first: "Tom", last: "Dale" } λ₯Ό 두 번째 ν–‰ <li>Godfrey CHAN</li> , λ‹€λ₯Έ 3 개 μž‘μ—…κ³Ό λΉ„κ΅ν•©λ‹ˆλ‹€.
  4. DOMμ—λŠ” λ„€ 번째 행이 μ—†μœΌλ―€λ‘œ μƒˆ 행을 μ‚½μž…ν•˜μ‹­μ‹œμ˜€.
    3.1. <li> λ…Έλ“œ μ‚½μž…
    3.2. ν…μŠ€νŠΈ λ…Έλ“œ ( "Godfrey") μ‚½μž…
    3.3. ν…μŠ€νŠΈ λ…Έλ“œ (곡백) μ‚½μž…
    3.4. to-upper-case λ„μš°λ―Έ 호좜 ( "Chan"-> "CHAN")
    3.5. ν…μŠ€νŠΈ λ…Έλ“œ ( "CHAN") μ‚½μž…

그것은 14 개의 μž‘μ—…μž…λ‹ˆλ‹€. μ•„μ•Ό!

πŸ”‘ @identity

κ°œλ…μ μœΌλ‘œ μš°λ¦¬κ°€ μ ‘ 두든 μΆ”κ°€ν•˜λ“ , μš°λ¦¬λŠ” μ—¬μ „νžˆ λ°°μ—΄μ˜ 단일 객체 만 λ³€κ²½ (μ‚½μž…)ν•˜κ³  있기 λ•Œλ¬Έμ— λΆˆν•„μš” ν•΄ λ³΄μ˜€μŠ΅λ‹ˆλ‹€. 졜적으둜, μš°λ¦¬λŠ” μΆ”κ°€ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œν–ˆλ˜ κ²ƒμ²˜λŸΌμ΄ μΌ€μ΄μŠ€λ₯Ό 처리 ν•  수 β€‹β€‹μžˆμ–΄μ•Όν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ key="@identity" κ°€ λ“€μ–΄μ˜΅λ‹ˆλ‹€. λ°°μ—΄μ—μžˆλŠ” μš”μ†Œμ˜ _order_에 μ˜μ‘΄ν•˜λŠ” λŒ€μ‹  JavaScript 개체 ID ( === )λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

  1. 데이터가 첫 번째 개체 { first: "Andrew", last: "Timberlake" } 와 μΌμΉ˜ν•˜λŠ” ( === ) κΈ°μ‘΄ 행을 μ°ΎμŠ΅λ‹ˆλ‹€. 아무것도 λ°œκ²¬λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ μƒˆ 행을 μ‚½μž… (μ•žμ— μΆ”κ°€)ν•©λ‹ˆλ‹€.
    1.1. <li> λ…Έλ“œ μ‚½μž…
    1.2. ν…μŠ€νŠΈ λ…Έλ“œ ( "Andrew") μ‚½μž…
    1.3. ν…μŠ€νŠΈ λ…Έλ“œ (곡백) μ‚½μž…
    1.4. to-upper-case λ„μš°λ―Έ 호좜 ( "Timberlake"-> "TIMBERLAKE")
    1.5. ν…μŠ€νŠΈ λ…Έλ“œ ( "TIMBERLAKE") μ‚½μž…
  2. 데이터가 두 번째 개체 { first: "Yehuda", last: "Katz" } 와 μΌμΉ˜ν•˜λŠ” ( === ) κΈ°μ‘΄ 행을 μ°ΎμŠ΅λ‹ˆλ‹€. <li>Yehuda KATZ</li> 발견 :
    2.1. "Yehuda"=== "Yehuda", ν•  일 μ—†μŒ
    2.2. (곡간에 동적 데이터가 ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ―€λ‘œ 비ꡐ가 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.)
    2.3. "Katz"=== "Katz", ν—¬νΌλŠ” "순수"μ΄λ―€λ‘œ to-upper-case 헬퍼λ₯Ό λ‹€μ‹œ 호좜 ν•  ν•„μš”κ°€ μ—†μŒμ„ μ•Œκ³  μžˆμœΌλ―€λ‘œ ν•΄λ‹Ή ν—¬νΌμ˜ 좜λ ₯을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€ ( "KATZ" ) _also_ λ³€κ²½λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ μ—¬κΈ°μ„œ ν•  일이 μ—†μŠ΅λ‹ˆλ‹€.
  3. λ§ˆμ°¬κ°€μ§€λ‘œ Tomκ³Ό Godfrey의 ν–‰μ—λŠ” ν•  일이 μ—†μŠ΅λ‹ˆλ‹€.
  4. μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” κ°œμ²΄κ°€μžˆλŠ” λͺ¨λ“  행을 μ œκ±°ν•©λ‹ˆλ‹€ (μ—†μŒ,이 경우 μˆ˜ν–‰ ν•  μž‘μ—… μ—†μŒ).

이λ₯Ό 톡해 졜적의 5 가지 μž‘μ—…μœΌλ‘œ λŒμ•„κ°‘λ‹ˆλ‹€.

ν™•μž₯

λ‹€μ‹œ λ§ν•˜μ§€λ§Œ 이것은 비ꡐ와 λΆ€κΈ° λΉ„μš©μ— 손을 ν”λ“œλŠ” κ²ƒμž…λ‹ˆλ‹€. 사싀, 그것듀도 λ¬΄λ£Œκ°€ μ•„λ‹ˆλ©°,이 μ•„μ£Ό κ°„λ‹¨ν•œ μ˜ˆμ—μ„œλŠ” κ·Έλ§Œν•œ κ°€μΉ˜κ°€ 없을 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λͺ©λ‘μ΄ 크고 각 행이 λ³΅μž‘ν•œ ꡬ성 μš”μ†Œ (λ§Žμ€ λ„μš°λ―Έ, 계산 된 속성, ν•˜μœ„ ꡬ성 μš”μ†Œ λ“±)λ₯Ό ν˜ΈμΆœν•œλ‹€κ³  μƒμƒν•΄λ³΄μ‹­μ‹œμ˜€. 예λ₯Ό λ“€μ–΄ LinkedIn λ‰΄μŠ€ ν”Όλ“œλ₯Ό μƒμƒν•΄λ³΄μ‹­μ‹œμ˜€. μ˜¬λ°”λ₯Έ 행을 μ˜¬λ°”λ₯Έ 데이터와 μΌμΉ˜μ‹œν‚€μ§€ μ•ŠμœΌλ©΄ ꡬ성 μš”μ†Œμ˜ μΈμˆ˜κ°€ 잠재적으둜 많이 변동될 수 있으며 μ˜ˆμƒλ³΄λ‹€ 훨씬 λ§Žμ€ DOM μ—…λ°μ΄νŠΈκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 잘λͺ»λœ DOM μš”μ†Œλ₯Ό μΌμΉ˜μ‹œν‚€κ³  μ»€μ„œ μœ„μΉ˜ 및 ν…μŠ€νŠΈ 선택 μƒνƒœμ™€ 같은 DOM μƒνƒœλ₯Ό μžƒλŠ” λ¬Έμ œλ„ μžˆμŠ΅λ‹ˆλ‹€.

μ „λ°˜μ μœΌλ‘œ μΆ”κ°€ 비ꡐ 및 ​​뢀기 λΉ„μš©μ€ μ‹€μ œ μ•±μ—μ„œ λŒ€λΆ€λΆ„μ˜ μ‹œκ°„ λ™μ•ˆ μ‰½κ²Œ κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. Ember의 기본값은 key="@identity" 이고 거의 λͺ¨λ“  κ²½μš°μ— 잘 μž‘λ™ν•˜κΈ° λ•Œλ¬Έμ— 일반적으둜 {{#each}} μ‚¬μš©ν•  λ•Œ key 인수 섀정에 λŒ€ν•΄ κ±±μ •ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

좩돌 πŸ’₯

ν•˜μ§€λ§Œ 잠깐, λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이 사건은 μ–΄λ–»μŠ΅λ‹ˆκΉŒ?

const YEHUDA = { first: "Yehuda", last: "Katz" };
const TOM = { first: "Tom", last: "Dale" };
const GODFREY = { first: "Godfrey", last: "Chan" };

this.list = [
  YEHUDA,
  TOM,
  GODFREY,
  TOM, // duplicate
  YEHUDA, // duplicate
  YEHUDA, // duplicate
  YEHUDA // duplicate
];

μ—¬κΈ°μ„œ λ¬Έμ œλŠ” λ™μΌν•œ 객체가 λ™μΌν•œ λͺ©λ‘μ— μ—¬λŸ¬ 번 λ‚˜νƒ€λ‚  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이것은 μˆœμ§„ν•œ @identity μ•Œκ³ λ¦¬μ¦˜, 특히 "데이터가 μΌμΉ˜ν•˜λŠ” κΈ°μ‘΄ ν–‰ μ°ΎκΈ° ( === ) ..."라고 λ§ν•œ 뢀뢄을 κΉ¨λœ¨λ¦½λ‹ˆλ‹€. μ΄λŠ” 데이터와 DOM 관계가 1 인 κ²½μš°μ—λ§Œ μž‘λ™ν•©λ‹ˆλ‹€. : 1,이 κ²½μš°μ—λŠ” 사싀이 μ•„λ‹™λ‹ˆλ‹€. 이것은 μ‹€μ œλ‘œλŠ” λΆˆκ°€λŠ₯ ν•΄ 보일 수 μžˆμ§€λ§Œ ν”„λ ˆμž„ μ›Œν¬λ‘œμ„œ μš°λ¦¬λŠ” 그것을 μ²˜λ¦¬ν•΄μ•Όν•©λ‹ˆλ‹€.

이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ μΌμ’…μ˜ ν•˜μ΄λΈŒλ¦¬λ“œ μ ‘κ·Ό 방식을 μ‚¬μš©ν•˜μ—¬ μ΄λŸ¬ν•œ μΆ©λŒμ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€. λ‚΄λΆ€μ μœΌλ‘œ ν‚€ -DOM 맀핑은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

"YEHUDA" => <li>Yehuda...</li>
"TOM" => <li>Tom...</li>
"GODFREY" => <li>Godfrey...</li>
"TOM-1" => <li>Tom...</li>
"YEHUDA-1" => <li>Yehuda...</li>
"YEHUDA-2" => <li>Yehuda...</li>
"YEHUDA-3" => <li>Yehuda...</li>

λŒ€λΆ€λΆ„μ˜ 경우, 이것은 맀우 λ“œλ¬Όκ³ , 그것이 λ‚˜μ˜€λ©΄ λŒ€λΆ€λΆ„μ˜ 경우 Good Enough β„’μ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€. μ–΄λ–€ 이유둜이 방법이 μž‘λ™ν•˜μ§€ μ•ŠλŠ” 경우 항상 ν‚€ 경둜 (λ˜λŠ” RFC 321의 κ³ κΈ‰ ν‚€ 지정 λ©”μ»€λ‹ˆμ¦˜)λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

"πŸ›"으둜 λŒμ•„ κ°€κΈ°

λͺ¨λ“  λŒ€ν™”κ°€ λλ‚˜λ©΄ 이제 Twiddleμ—μ„œ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μ‚΄νŽ΄λ³Ό μ€€λΉ„κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

기본적으둜 [undefined, undefined, undefined, undefined, undefined] λͺ©λ‘μœΌλ‘œ μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€.

κ΄€λ ¨μ—†λŠ” λ©”λͺ¨ : Array(5) λŠ” [undefined, undefined, undefined, undefined, undefined] 와 λ™μΌν•˜μ§€ _ μ•„λ‹™λ‹ˆλ‹€ _. 일반적으둜 ν”Όν•΄μ•Όν•˜λŠ” "홀리 μ–΄λ ˆμ΄"λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ "ꡬ멍"에 μ•‘μ„ΈμŠ€ ν•  λ•Œ μ‹€μ œλ‘œ undefined 돌렀 λ°›κΈ° λ•Œλ¬Έμ—μ΄ 버그와 관련이 μ—†μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ 우리의 _ 맀우 쒁은 _ λͺ©μ μ„ μœ„ν•΄μ„œλ§Œ, 그것듀은 λ™μΌν•©λ‹ˆλ‹€.

ν‚€λ₯Ό μ§€μ •ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— EmberλŠ” 기본적으둜 @identity λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. λ˜ν•œ 좩돌이기 λ•Œλ¬Έμ— λ‹€μŒκ³Ό 같은 κ²°κ³Όλ₯Ό μ–»μ—ˆμŠ΅λ‹ˆλ‹€.

"undefined" => <input ...> 0: ...,
"undefined-1" => <input ...> 1: ...,
"undefined-2" => <input ...> 2: ...,
"undefined-3" => <input ...> 3: ...,
"undefined-4" => <input ...> 4: ...

이제 첫 번째 ν™•μΈλž€μ„ ν΄λ¦­ν•œλ‹€κ³  κ°€μ • ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

  1. 선택 μƒμžμ˜ κΈ°λ³Έ λ™μž‘μ„ νŠΈλ¦¬κ±°ν•©λ‹ˆλ‹€. 선택 μƒνƒœλ₯Ό true둜 λ³€κ²½ν•©λ‹ˆλ‹€.
  2. {{action}} μˆ˜μ • μžμ— μ˜ν•΄ μ°¨λ‹¨λ˜κ³  makeChange λ©”μ†Œλ“œλ‘œ λ‹€μ‹œ μ „λ‹¬λ˜λŠ” 클릭 이벀트λ₯Ό νŠΈλ¦¬κ±°ν•©λ‹ˆλ‹€.
  3. λͺ©λ‘μ„ [true, undefined, undefined, undefined, undefined] λ³€κ²½ν•©λ‹ˆλ‹€.
  4. DOM을 μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.

DOM은 μ–΄λ–»κ²Œ μ—…λ°μ΄νŠΈλ©λ‹ˆκΉŒ?

  1. 데이터가 첫 번째 개체 true 와 μΌμΉ˜ν•˜λŠ” ( === ) κΈ°μ‘΄ 행을 μ°ΎμŠ΅λ‹ˆλ‹€. 아무것도 λ°œκ²¬λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ μƒˆ ν–‰ <input checked=true ...>0: true... μ‚½μž… (μ•žμ— μΆ”κ°€)
  2. 데이터가 두 번째 개체 undefined 와 μΌμΉ˜ν•˜λŠ” ( === ) κΈ°μ‘΄ 행을 μ°ΎμŠ΅λ‹ˆλ‹€. <input ...>0: ... 발견 (μ΄μ „μ˜ 첫 번째 ν–‰) :
    2.1. {{idx}} ν…μŠ€νŠΈ λ…Έλ“œλ₯Ό 1
    2.2. 그렇지 μ•ŠμœΌλ©΄, Emberκ°€ 말할 μˆ˜μžˆλŠ” ν•œ,이 ν–‰μ—μ„œ λ‹€λ₯Έ 것은 아무것도 λ³€κ²½λ˜μ§€ μ•Šμ•˜μœΌλ©° λ‹€λ₯Έ ν•  일도 μ—†μŠ΅λ‹ˆλ‹€.
  3. 데이터가 μ„Έ 번째 개체 undefined 와 μΌμΉ˜ν•˜λŠ” ( === ) κΈ°μ‘΄ 행을 μ°ΎμŠ΅λ‹ˆλ‹€. undefined 두 번째둜 λ³΄μ•˜μœΌλ―€λ‘œ λ‚΄λΆ€ ν‚€λŠ” undefined-1 μ΄λ―€λ‘œ <input ...>1: ... (μ΄μ „μ˜ SECOND ν–‰)을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.
    3.1. {{idx}} ν…μŠ€νŠΈ λ…Έλ“œλ₯Ό 2
    3.2. 그렇지 μ•ŠμœΌλ©΄, Emberκ°€ 말할 μˆ˜μžˆλŠ” ν•œ,이 ν–‰μ—μ„œ λ‹€λ₯Έ 것은 아무것도 λ³€κ²½λ˜μ§€ μ•Šμ•˜μœΌλ©° λ‹€λ₯Έ ν•  일도 μ—†μŠ΅λ‹ˆλ‹€.
  4. λ§ˆμ°¬κ°€μ§€λ‘œ undefined-2 및 undefined-3
  5. λ§ˆμ§€λ§‰μœΌλ‘œ, μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” undefined-4 행을 μ œκ±°ν•©λ‹ˆλ‹€ (μ—…λ°μ΄νŠΈ ν›„ 배열에 undefined κ°€ ν•˜λ‚˜ 더 μ μœΌλ―€λ‘œ).

κ·Έλž˜μ„œ 이것은 μš°λ¦¬κ°€ νŠΈμœ„λ“€μ—μ„œ 얻은 κ²°κ³Όλ₯Ό μ–΄λ–»κ²Œ μ–»μ—ˆλŠ”μ§€ μ„€λͺ…ν•©λ‹ˆλ‹€. 기본적으둜 λͺ¨λ“  DOM 행이 ν•˜λ‚˜μ”© μ•„λž˜λ‘œ μ΄λ™ν•˜κ³  μƒˆ 행이 맨 μœ„μ— μ‚½μž…λ˜κ³  {{idx}} κ°€ λ‚˜λ¨Έμ§€ 행에 λŒ€ν•΄ μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€.

정말 μ˜ˆμƒμΉ˜ λͺ»ν•œ 뢀뢄은 2.2μž…λ‹ˆλ‹€. 첫 번째 ν™•μΈλž€ (클릭 ν•œ ν™•μΈλž€)이 ν•œ ν–‰μ”© μ•„λž˜λ‘œ μ΄λ™ν•˜μ—¬ 두 번째 μœ„μΉ˜λ‘œ μ΄λ™ν–ˆμ§€λ§Œ, Ember의 checked 속성이 true λ³€κ²½ 될 κ²ƒμœΌλ‘œ μ˜ˆμƒν–ˆμ„ κ²ƒμž…λ‹ˆλ‹€. λ°”μš΄λ“œ 값이 μ •μ˜λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— Emberκ°€ λ‹€μ‹œ false 둜 λ³€κ²½ν•˜μ—¬ 체크λ₯Ό ν•΄μ œ ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 이것은 μž‘λ™ 방식이 μ•„λ‹™λ‹ˆλ‹€. μ²˜μŒμ— μ–ΈκΈ‰ν–ˆλ“―μ΄ DOM에 μ•‘μ„ΈμŠ€ν•˜λŠ” 것은 λΉ„μš©μ΄ 많이 λ“­λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” DOM의 _reading_이 ν¬ν•¨λ©λ‹ˆλ‹€. μ—…λ°μ΄νŠΈ ν•  λ•Œλ§ˆλ‹€ 비ꡐλ₯Ό μœ„ν•΄ DOMμ—μ„œ μ΅œμ‹  값을 μ½μ–΄μ•Όν•œλ‹€λ©΄ μ΅œμ ν™” λͺ©μ μ„ 거의 λ¬΄νš¨ν™” ν•  κ²ƒμž…λ‹ˆλ‹€. λ”°λΌμ„œμ΄λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ DOM에 κΈ°λ‘ν•œ λ§ˆμ§€λ§‰ 값을 κΈ°μ–΅ν•˜κ³  DOMμ—μ„œ λ‹€μ‹œ 읽을 ν•„μš”μ—†μ΄ ν˜„μž¬ 값을 μΊμ‹œ 된 κ°’κ³Ό λΉ„κ΅ν•©λ‹ˆλ‹€. μ°¨μ΄κ°€μžˆμ„ λ•Œλ§Œ DOM에 μƒˆ 값을 μ“°κ³  λ‹€μŒ λ²ˆμ— μΊμ‹œν•©λ‹ˆλ‹€. 이것은 μš°λ¦¬κ°€ λ™μΌν•œ "가상 DOM"μ ‘κ·Ό 방식을 κ³΅μœ ν•˜λŠ” μ˜λ―Έμ΄μ§€λ§Œ 전체 DOM의 "트리 λ‹ˆμŠ€"λ₯Ό κ°€μƒν™”ν•˜μ§€ μ•Šκ³  리프 λ…Έλ“œμ—μ„œλ§Œ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ TL; DR, checked 속성 (λ˜λŠ” ν…μŠ€νŠΈ ν•„λ“œμ˜ value 속성 λ“±)을 "바인딩"ν•˜λ©΄ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. <div>{{this.name}}</div> λ₯Ό λ Œλ”λ§ν•˜κ³  jQuery λ˜λŠ” Chrome 검사기λ₯Ό μ‚¬μš©ν•˜μ—¬ div μš”μ†Œμ˜ textContent λ₯Ό μˆ˜λ™μœΌλ‘œ μ—…λ°μ΄νŠΈ this.name λ₯Ό μ—…λ°μ΄νŠΈ ν•  κ²ƒμ΄λΌκ³ λŠ” μ˜ˆμƒν•˜μ§€ λͺ»ν–ˆμ„ κ²ƒμž…λ‹ˆλ‹€. 이것은 기본적으둜 λ™μΌν•©λ‹ˆλ‹€. checked 속성에 λŒ€ν•œ μ—…λ°μ΄νŠΈκ°€ Ember μ™ΈλΆ€μ—μ„œ λ°œμƒν–ˆκΈ° λ•Œλ¬Έμ— (ν™•μΈλž€μ— λŒ€ν•œ λΈŒλΌμš°μ €μ˜ κΈ°λ³Έ λ™μž‘μ„ 톡해) EmberλŠ” 이에 λŒ€ν•΄ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.

이것이 {{input}} λ„μš°λ―Έκ°€ μ‘΄μž¬ν•˜λŠ” μ΄μœ μž…λ‹ˆλ‹€. κ΄€λ ¨ 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό κΈ°λ³Έ HTML μš”μ†Œμ— λ“±λ‘ν•˜κ³  μž‘μ—…μ„ μ μ ˆν•œ 속성 변경에 λ°˜μ˜ν•˜μ—¬ 이해 λ‹Ήμ‚¬μž (예 : λ Œλ”λ§ λ ˆμ΄μ–΄)μ—κ²Œ μ•Œλ¦΄ 수 μžˆλ„λ‘ν•΄μ•Όν•©λ‹ˆλ‹€.

그것이 우리λ₯Ό λ– λ‚˜λŠ” 곳이 ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 이것이 μ™œ λ†€λΌμš΄ 지 μ΄ν•΄ν•˜μ§€λ§Œ 이것이 일련의 λΆˆν–‰ν•œ μ‚¬μš©μž 였λ₯˜λΌκ³  λ§ν•˜λŠ” κ²½ν–₯이 μžˆμŠ΅λ‹ˆλ‹€. μ•„λ§ˆλ„ μš°λ¦¬λŠ” μž…λ ₯ μš”μ†Œμ— μ΄λŸ¬ν•œ 속성을 λ°”μΈλ”©ν•˜λŠ” 것에 λŒ€ν•΄ λ¦°νŒ…ν•΄μ•Όν• κΉŒμš”?

@chancancode- λ†€λΌμš΄ μ„€λͺ…에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. μ΄λŠ” <input ... > λ₯Ό μ ˆλŒ€λ‘œ μ‚¬μš©ν•΄μ„œλŠ” μ•ˆλ˜μ§€λ§Œ 이와 같은 λͺ¨λ“  였λ₯˜λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ {{input ...}} 만 μ‚¬μš©ν•΄μ•Όν•œλ‹€λŠ” μ˜λ―Έμž…λ‹ˆκΉŒ?

@ boris-petrovμ—λŠ” "이 URL을 클립 λ³΄λ“œμ— 볡사"ν•˜λŠ” 읽기 μ „μš© ν…μŠ€νŠΈ ν•„λ“œμ™€ 같은 μ œν•œλœ κ²½μš°κ°€μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜λŠ” μž…λ ₯ μš”μ†Œ + {{action}} 을 (λ₯Ό) κ°€λ‘œ 챌 수 μžˆμŠ΅λ‹ˆλ‹€. DOM 이벀트λ₯Ό μˆ˜ν–‰ν•˜κ³  속성 μ—…λ°μ΄νŠΈλ₯Ό μˆ˜λ™μœΌλ‘œ λ°˜μ˜ν•©λ‹ˆλ‹€ ( @identity μΆ©λŒλ„ λ°œμƒν•œλ‹€λŠ” 점을 μ œμ™Έν•˜λ©΄ twiddle이 μ‹œλ„ν•œ μž‘μ—…μž…λ‹ˆλ‹€).ν•˜μ§€λ§Œ 예 μ–΄λ–€ μ‹œμ μ—μ„œλŠ” {{input}} 만 λ‹€μ‹œ κ΅¬ν˜„ν•©λ‹ˆλ‹€. 이미 처리 ν•œ λͺ¨λ“  κ°€μž₯자리 μΌ€μ΄μŠ€λ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‚˜λŠ” 당신이 {{input}} μ „λΆ€λŠ” μ•„λ‹ˆμ§€λ§Œ λŒ€λΆ€λΆ„μ˜ μ‹œκ°„μ— μ‚¬μš©ν•΄μ•Όν•œλ‹€κ³  λ§ν•˜λŠ” 것이 _ μ•„λ§ˆλ„ _ κ³΅ν‰ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ ν‚€μ™€μ˜ μΆ©λŒμ΄μžˆλŠ”μ΄ κ²½μš°λŠ” μ—¬μ „νžˆ "κ³ μ •"λ˜μ§€ μ•Šμ•˜μ„ κ²ƒμž…λ‹ˆλ‹€. https://ember-twiddle.com/0f2369021128e2ae0c445155df5bb034?openFiles=templates.application.hbs%2C μ°Έμ‘°

κ·Έλž˜μ„œ μ œκ°€μ΄ λ¬Έμ œμ— λŒ€ν•΄ μ–΄λ–»κ²Œν•΄μ•Όν• μ§€ 100 % ν™•μ‹€ν•˜μ§€ μ•Šλ‹€κ³  λ§ν–ˆμŠ΅λ‹ˆλ‹€. ν•œνŽΈμœΌλ‘œλŠ” λ†€λžκ³  μ˜ˆμƒμΉ˜ λͺ»ν•œ μΌμ΄λΌλŠ” 데 λ™μ˜ν•©λ‹ˆλ‹€. λ°˜λ©΄μ— μ΄λŸ¬ν•œ μ’…λ₯˜μ˜ μΆ©λŒμ€ μ‹€μ œ μ•±μ—μ„œ 맀우 λ“œλ¬Όλ©° "ν‚€"인수λ₯Ό μ‚¬μš©μž μ •μ˜ ν•  μˆ˜μžˆλŠ” μ΄μœ μž…λ‹ˆλ‹€ (κΈ°λ³Έ "@identity"ν‚€κ°€μžˆλŠ” 경우) κΈ°λŠ₯은 Good Enough β„’κ°€ μ•„λ‹ˆλ―€λ‘œ ν•΄λ‹Ή κΈ°λŠ₯이 μ‘΄μž¬ν•©λ‹ˆλ‹€.)

@chancancode- 이것은 λ‚΄κ°€ μ–Όλ§ˆ 전에 μ—΄μ—ˆλ˜ 또 λ‹€λ₯Έ 문제λ₯Ό μƒκΈ°μ‹œν‚¨λ‹€. λΉ„μŠ·ν•œ 것이 μžˆλ‹€κ³  μƒκ°ν•˜μ‹­λ‹ˆκΉŒ? 내가받은 λŒ€λ‹΅ (λ°°μ—΄ μš”μ†Œλ₯Ό μ„€μ •ν•  λ•Œ set λŒ€μ‹  replace 을 (λ₯Ό) μ‚¬μš©ν•  ν•„μš”κ°€ 있음) μ—¬μ „νžˆ λ‚˜μ—κ²Œ μ΄μƒν•˜κ²Œ λ³΄μž…λ‹ˆλ‹€.

@ boris-petrov λ‚˜λŠ” 그것이 관련이 μžˆλ‹€κ³  μƒκ°ν•˜μ§€ μ•ŠλŠ”λ‹€

μ•ˆλ…•ν•˜μ„Έμš”, μš°λ¦¬λŠ” ember둜 λ“œλž˜κ·Έ κ°€λŠ₯ν•œ λͺ©λ‘μ— sortablejsλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. plsλŠ” 각 문제λ₯Ό μž¬ν˜„ν•˜κΈ° μœ„ν•΄μ΄ 데λͺ¨ λ₯Ό ν™•μΈν•©λ‹ˆλ‹€.

단계:

  • ν•œ ν•­λͺ©μ„ λ§ˆμ§€λ§‰μœΌλ‘œ λ“œλž˜κ·Έ
  • 선택을 'v2'둜 μ „ν™˜

λ“œλž˜κ·Έ ν•œ ν•­λͺ©μ΄ DOM νŠΈλ¦¬μ— λ‚¨μ•„μžˆλŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ ν•­λͺ©μ„ λ‹€λ₯Έ μœ„μΉ˜ (λ§ˆμ§€λ§‰ ν•­λͺ©μ΄ μ•„λ‹˜)둜 λ“œλž˜κ·Έν•˜λ©΄ 잘 μž‘λ™ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰