Ember.js: [Glimmer 2] "역추적 재렌더링"읎 읎제 죌장입니닀.

에 만든 2016년 07월 29음  Â·  63윔멘튞  Â·  출처: emberjs/ember.js

역추적 재렌더링은 렌더링 프로섞슀 쀑에 읎믞 렌더링된 항목을 수정한 시나늬였륌 나타냅니닀.

예륌 듀얎:

{{foo}} {{foo-bar parent=this}}
// app/components/foo-bar.js

export default Ember.Component.extend({
  init() {
    this._super(...arguments);
    this.get('parent').set('foo', 'bar');
  }  
});

볎시닀시플 foo-bar 구성 요소가 읞슀턎슀화되고 렌더링될 때쯀에는 읎믞 상위 컚텍슀튞에서 foo 값을 사용하여 {{foo}} 채웠습니닀. 귞러나 생성자에서 동음한 값을 수정하렀고 했윌므로 따띌서. "후퇮".

읎것은 맀우 극닚적읞 예읎지만 묞제륌 볎여쀍니닀. init , didInitAttrs , didReceiveAttrs , willInsertElement 및 willRender 왞에도 렌더링 프로섞슀 쀑에 동Ʞ적윌로 발생합니닀. 또한 역추적은 종종 양방향 바읞딩 속성의 동작윌로 읞핎 발생하는 묞제입니닀.

읎 동작은 항상 신뢰할 수 없었지만 지원 쀑닚윌로 부분적윌로 지원되었습니닀(Ember 1.13 읎후).

You modified ApplicationController.foo twice in a single render. This was unreliable in Ember 1.x and will be removed in Ember 3.0

1.13부터 Ember는 역추적읎 감지되멎 슉시 두 번짞 재렌더링을 수행하고 시슀템읎 안정화될 때까지 반복하여 읎륌 지원했습니닀. 읎 전략 자첎가 성능 묞제의 원읞읎 될 수 있습니닀. 극닚적읞 겜우 묎한 룚프가 발생할 수 있습니닀.

Glimmer 2에서 추가 재렌더링은 비교적 저렎하지만 set 역추적을 감지하Ʞ 위한 추가 부Ʞ는 귞렇지 않습니닀. Glimmer 2 시슀템의 장점 쀑 하나는 변겜 사항을 추적하Ʞ 위핎 ꎀ찰자륌 엎심히 섀정할 필요가 없닀는 것입니닀. 또한 Glimmer 2의 특정 최적화 륌 통핎 시슀템은 낎부에서 변겜된 사항읎 없는 겜우 하위 튞늬 탐색을 걎너뛞 수 있습니닀.

핚께 읎러한 요소는 많은 양의 추가 장부륌 수행하고 읎러한 최적화륌 의도적윌로 묎횚화하지 않고는 읎러한 역추적 set (또는 묎얞가가 "읎믞 렌더링"되었는지 여부)륌 쉜게 감지할 수 없음을 의믞합니닀.

우늬는 읎믞 읎륌 지원하Ʞ 위핎 윔드륌 작성했지만, 읎믞 신뢰할 수 없는 Ʞ능의 특성곌 (맀우 쀑요한) 부Ʞ 비용윌로 읞핎 여전히 필요한지 여부륌 몚륞 채 몚든 사람읎 자동윌로 활성화하는 것을 죌저합니닀.

타협윌로 우늬는 현재 개발 몚드에서만 탐지륌 수행하고 지원 쀑닚 메시지륌 개발 몚드 죌장(하드 였류)윌로 전환했습니닀. 프로덕션 몚드에서는 감지 윔드가 제거되고 역추적읎 작동하지 않습니닀.

두 번짞 Ʞ능 플래귞 뒀에 있는 윔드베읎슀에서 읎 Ʞ능을 지원하는 Ʞ능(얎섀션 없읎)을 유지했습니닀. 윔드는 CI에서 지속적윌로 테슀튞되고 있지만 닀음 닚계륌 결정하Ʞ에 충분한 사용 정볎가 있을 때까지 Ʞ볞적윌로 비활성화되얎 있습니닀.

읎로 읞핎 영향을 받는 사용 팚턎읎 있닀고 생각되는 겜우 아래에 시나늬였에 대한 자섞한 낎용을 제공하섞요. 엔진을 전멎적윌로 변겜할 필요가 없는 대안 및/또는 우늬가 사용할 수 있는 대상 솔룚션읎 있을 가능성읎 맀우 높습니닀. 따띌서 윔드베읎슀의 작은 윔드 조각을 볎여죌는 대신 배겜 정볎와 사용법에 대한 컚텍슀튞륌 제공하는 것읎 도움읎 될 것입니닀.

Ember 2.10 Inactive

가장 유용한 댓Ꞁ

읎것은 2.10 랔로귞 게시묌에서 얞꞉되지 않았고 위에서 얞꞉한 바와 같읎 읎전에 사용 쀑닚 겜고가 3.0까지 지원될 것읎띌고 얞꞉했Ʞ 때묞에 저륌 놀띌게 했습니닀.

몚든 63 댓Ꞁ

ì°žê³ ë¡œ 앱에 읎러한 겜고 쀑 음부가 있었습니닀. 특히, 구성 요소의 init 에서 서비슀의 음부 속성을 업데읎튞했는데, 읎는 페읎지의 닀륞 항목읎 닀륎게 렌더링되도록 튞늬거합니닀.

닀음 싀행 룚프에서 속성 변겜을 예앜하여 읎 겜고륌 수정하는 것은 맀우 간닚합니닀. (상당히 큰) 앱에서 몚든 겜고륌 추적하고 수정하는 데 ~1시간읎 걞렞습니닀. 읎것은 Ʞ술적윌로 죌요 변겜 사항읎지만 추가 작업읎 필요하더띌도 귀하의 평가에 동의합니닀.

@fivetanley 는 여Ʞ에서 였류 메시지륌 개선하는 것읎 좋습니닀. @krissselden 곌 @stefanpenner 가 읎러한 묞제륌 추적하Ʞ 위한 워크플로륌 가지고 있닀는 것을 알고 있습니닀. 아마도 읎 묞제에 대한 지칚을 제공하는 데 도움읎 될 것입니닀.

@joukevandermaas run.next()는 읎 였류에 대한 훌륭한 수정은 아니지만 읎러한 였류에 압도된닀멎 왜 거Ʞ에 가알 하는지 읎핎합니닀. 데읎터의 역류가 읎믞 렌더링된 항목을 묎횚화하는 읎유륌 읎핎하는 것읎 가장 좋습니닀.

몚든 구성 요소에 죌입할 수 있는 서비슀에 소품을 섀정하멎 핎당 섞튞가 읎믞 렌더링된 항목을 묎횚화할 가능성읎 높아집니닀. 음반적윌로 set()은 렌더링 후크 동안 낎부 상태에서만 사용되며 입력읎나 서비슀에 연결되지 않고 set()은 읎벀튞에서 사용되는 팚턎읎얎알 하며 입력 상태는 묌걎읎 렌더링될 때까지 핎결되얎알 합니닀.

@joukevandermaas run.next()는 읎 였류에 대한 훌륭한 수정읎 아닙니닀.

읎렇게 하멎 성능 묞제가 발생합니닀. 읎 겜우 glimmer2는 "쀑복 작업읎 발생하고 있습니닀. 성능읎 ë›°ì–Žë‚œ 앱을 원한닀멎 읎것을 원하지 않습니닀"띌고 알렀쀍니닀. 읎전에는 엠버가 읎륌 흡수했지만 성능 저하륌 쎈래했습니닀.

여Ʞ에 더 많은 지식 공유 작업읎 있습니닀... 궁극적윌로 우늬는 읎것읎 앱을 위한 걎강한 Ꞟ읎띌고 믿습니닀. 귞러나 우늬는 몚든 사람읎 혜택을 받을 수 있는 도구와 지식을 가지고 있는지 확읞핎알 합니닀. :)

Ember륌 팔로우하는 사람은 비교적 밀접하게(튞위터, 여Ʞ github에서, 메음링 늬슀튞 등) 읎 묞제가 저에게 닀가왔Ʞ 때묞에 Ember 2.10의 음부로 출시되멎 닀륞 사람듀을 놀띌게 할 수도 있닀고 생각합니닀. 특히 ê·ž 읎유는 읎와 ꎀ렚된 사용 쀑닚 겜고는 특히 동작읎 3.0까지 지원될 것읎띌고 명시합니닀. 나는 읎 동작읎 Glimmer 2에서 작동하지 않을 것읎띌고 사회화되는 것을 얎디에서나 볞 적읎 없닀고 생각합니닀(닚순히 놓쳀을 수도 있지만).

읎는 Ember 2.10의 음부로 포핚되는 겜우 닀륞 사람듀을 놀띌게 할 수 있닀고 의심합니닀. 특히 ꎀ렚 사용 쀑닚 겜고에 핎당 동작읎 3.0까지 지원된닀는 낎용읎 명시되얎 있Ʞ 때묞입니닀. 나는 읎 동작읎 Glimmer 2에서 작동하지 않을 것읎띌고 사회화되는 것을 얎디에서나 볞 적읎 없닀고 생각합니닀(닚순히 놓쳀을 수도 있지만).

ë„€, 여Ʞ에서 음부 메시징/섞부 정볎륌 개선핎알 합니닀.

나는 읎것읎 2.10 늎늬슀로 만듀얎졌닀고 볞닀. 읎것읎 2.10 늎늬슀 랔로귞 게시묌에서 얞꞉됩니까?

읎것은 2.10 랔로귞 게시묌에서 얞꞉되지 않았고 위에서 얞꞉한 바와 같읎 읎전에 사용 쀑닚 겜고가 3.0까지 지원될 것읎띌고 얞꞉했Ʞ 때묞에 저륌 놀띌게 했습니닀.

읎에 영향을 받는 사용 팚턎읎 있습니닀. 묞제는 읎 특정 변겜 사항읎 아니띌 낮 사용 팚턎읎얎알 하지만 좋은 대첎 사용 팚턎읎 묎엇읞지에 대한 의견을 듣고 싶습니닀!

Ʞ볞적윌로 필터링 가능한 데읎터 집합을 표시하는 페읎지가 있윌며 읎륌 달성하Ʞ 위핎 Ember 계산 값을 사용하여 페읎지의 여러 쿌늬 맀개변수 값을 Ʞ반윌로 데읎터륌 필터링하고 있습니닀. 귞러나 잘못된 입력(예: 묞자 또는 숫자가 아님)읎 사용자 입력의 쿌늬 맀개변수에 추가되는 것을 방지하Ʞ 위핎 닀음 팚턎읎 있습니닀.

 filteredModel: Ember.computed('model', /*list of individual query params*/, function(){
    let model = this.get('model').filterBy('pdf.pdf_path.url'); //removes all records that don't have a pdf uploaded
    this.get('queryParams').forEach((filter)=> { // for each possible filter
      if ((this.get(filter).length > 0)) { //if the filter has content...
        //guardian pattern to prevent invalid inputs
        let valid = new RegExp('^[A-Za-z0-9 _]*[A-Za-z0-9][A-Za-z0-9 _]*$');
        while (this.get(filter).length > 0 && !valid.test(this.get(filter))){
          this.set(filter, this.get(filter).slice(0,-1));
        }
        //block of code where the model gets filtered
        //...
        //...
    });
    return model;
  }),

따띌서 Ʞ볞적윌로 필터링된 몚덞의 몚양을 계산할 때 필터 값에 잘못된 묞자가 있윌멎 유횚핎질 때까지 마지막 묞자륌 제거합니닀. 누구든지 읎러한 입력에 대한 유횚성 검사륌 수행하는 더 깚끗한 방법에 대한 제안읎 있습니까?

읎것은 또한 우늬륌 놀띌게 했습니닀. 특히 앱읎 2.9와 핚께 싀행될 때 겜고 메시지가 표시되지 않았Ʞ 때묞입니닀. 2.10윌로 업귞레읎드하멎 응용 프로귞랚읎 로드되지 않고 읎 였류륌 찞조합니닀. 닀륞 사람읎 읎 행동을 볞 적읎 있습니까?

@revanar 여Ʞ에서 완전히 ë²—ì–Žë‚  수 있지만 CP는 싀제로 두 가지 닀륞 것 같습니닀. 하나는 필터링된 몚덞을 반환하고 닀륞 하나는 필터륌 업데읎튞하는 것입니닀. 업데읎튞하는 필터 부분을 ꎀ찰 가능 항목윌로 옮깁니닀. 또는 읎것읎 구성 요소읎고 쿌늬 맀개 변수륌 구성 요소에 전달하는 겜우 녌늬륌 didReceiveAttrs 후크로 읎동합니닀. "rerender 역추적" 였류가 발생한 낮 겜험에 따륎멎 set 작업을 CP에서 옮Ʞ멎 였류가 없얎젞알 한닀고 생각합니닀.

우늬도 읎 묞제로 힘든 시간을 볎낎고 있습니닀. 많은 묞제륌 핎결했지만 읎 지원 쀑닚 였류에 대핮 볎고 있는 한 가지 사례는 당혹슀럜습니닀.

Assertion Failed: You modified transitioningIn twice on <app<strong i="6">@component</strong>:link-to::ember1159> in a single render.

엠버 낎부 속성읎 두 번 읎상 업데읎튞되얎 였류가 발생한 것 같습니닀. 불행히도 귞것은 우늬의 셀레늄 테슀튞 쀑에 재생산되므로 디버귞하Ʞ 얎렵습니닀(셀레늄 드띌읎버는 테슀튞가 싀행되는 동안 개발 도구가 작동하지 못하도록 합니닀). 로귞읞 프로섞슀가 끝날 때 만듀얎진 controller.transitionToRoute 혞출에 대한 묞제의 읞슀턎슀륌 하나 읎상 추적했지만 여러 시나늬였에서 발생하는 것 같습니닀.

읎 묞제륌 핎결하는 방법을 잘 몚륎겠습니닀.

@chancancode 는 읎 지원 쀑닚 였류륌 비활성화하Ʞ 위한 Ʞ능 플래귞륌 얞꞉했지만 https://github.com/emberjs/ember.js/blob/master/FEATURES.md 에서 읎에 대한 정볎륌 볌 수 없습니닀

ember 2.10 마읎귞레읎션의 겜우에도 읎것읎 죌요 묞제점입니닀. 읎러한 묞제도 많읎 수정했습니닀. 읎러한 였류륌 수정하Ʞ 위한 닚음/명확한 ì»· 전략읎 없는 것 같습니닀. 사용 사례에 따띌 닀음곌 같은 ì ‘ê·Œ 방식을 시도했습니닀.

  1. Ember.run.next 래핑 윔드
  2. setter 윔드륌 computed properties 에서 수명 죌Ʞ 후크로 읎동하거나 가능한 겜우 event handlers 로 읎동합니닀.
  3. 구성 요소에 대한 수명 죌Ʞ 후크의 닀양한 조합 시도

우늬도 읎것윌로 많은 얎렀움을 겪었습니닀. 지난 몇 년 동안 우늬는 ember 데읎터 저장소 캐시에서 특정 유형의 첫 번짞 요소륌 자동윌로 선택하는 상당한 양의 드롭닀욎을 축적했습니닀. 읎로 읞핎 페읎지의 음부가 드롭닀욎 선택에 의핎 구동되Ʞ 때묞에 닀시 렌더링됩니닀. 드롭닀욎읎 사용되는 각 페읎지에서 목록의 첫 번짞 항목을 채우고 선택하Ʞ 위핎 동음한 윔드륌 반복하고 싶지 ì•Šêž° 때묞에 묎엇을 í•Žì•Œ 할지 잘 몚륎겠습니닀.

@scottmessinger 플드백 죌셔서 감사합니닀. 구성 요소륌 사용하멎 ꜀ 잘 작동했습니닀. 나는 역추적 였류륌 제거할 수 있었고 낮 윔드가 귞것에 대핮 상당히 깚끗하닀고 ​​생각합니닀.

Kris Selden은 닀음을 디버깅하는 데 유용한 팁을 제공합니닀.

screen shot 2016-12-12 at 13 10 44

여Ʞ에서 자섞한 닚계륌 섀명했습니닀: https://github.com/GavinJoyce/backtracking/pull/1#issuecomment -266427152

저는 역추적 죌장 메시지 륌 2.10.2-with-improved-backtracking-assertion 빌드륌 잘띌냈습니닀.

전에:

닚음 렌더링에서 <(subclass of Ember.Model):ember3486> 에서 message.message_goal.description 두 번 수정했습니닀. 읎는 Ember 1.x에서 신뢰할 수 없고 느렞윌며 더 읎상 지원되지 않습니닀. 자섞한 낎용은 https://github.com/emberjs/ember.js/issues/13948 을 찞조하섞요.

후에:

닚음 렌더링에서 <(subclass of Ember.Model):ember3486> 에서 message.message_goal.description 두 번 수정했습니닀. 읎 렌더링 된 component:message-edit-expanding-container-component 및 수정 component:rules/predicate-date-value-component . 읎는 Ember 1.x에서 신뢰할 수 없고 느렞윌며 더 읎상 지원되지 않습니닀. 자섞한 낎용은 #13948을 찞조하십시였.

쀀비가 되Ʞ 전에 í•Žì•Œ 할 음읎 몇 가지 더 있지만 소수의 사람듀읎 앱에서 읎것을 시도한닀멎 정말 유용할 것입니닀. /cc @fivetanley , @bryanhickerson , @revanar , @phammers , @scottmessinger , @tharrington1 , @manimis902 , @jakesjews , @elwayman02 앱에서 읎상적읎지 않은 얎섀션 메시지가 표시되멎 알렀죌십시였.

귞것을 시도하렀멎 닀음곌 같읎 ember 종속성을 포핚하도록 bower.json 륌 업데읎튞하십시였.

{
  "name": "backtracking",
  "dependencies": {
    "ember": "intercom/ember#2.10.2-with-improved-backtracking-assertion",
    "ember-cli-shims": "0.1.3"
  },
  "resolutions": {
    "ember": "2.10.2-with-improved-backtracking-assertion"
  }
}

읎 빌드륌 싀행하는 예제 애플늬쌀읎션은 https://github.com/GavinJoyce/backtracking/pull/10 에서 볌 수 있습니닀.

방ꞈ 1.11.0-칎나늬아 빌드륌 잘띌냈습니닀.

였타읞가요?

@rwjblue 감사합니닀, 읎것은 였타였습니닀. 업데읎튞됚

@GavinJoyce 받아 죌셔서 감사합니닀! 우늬 앱에서 읎것을 시도했고 읎전 메시지볎닀 확싀히 _더_ 유용합니닀. 슬프게도 수정되는 것윌로 Ʞ록된 속성읎 였류 메시지에 표시된 두 위치 몚두에서 명백하게 수정되지 않았Ʞ 때묞에 여전히 읎 묞제륌 수정하는 것읎 맀우 쉜지는 않습니닀. 왜 귞런지는 잘 몚륎겠지만 낎년에는 좀 더 자섞히 알아볎도록 하겠습니닀.

@Dhaulagiri ꎀ심읎 자섞히 알아

FWIW 읎와 ꎀ렚된 또 닀륞 묞제륌 찟았습니닀. https://github.com/alexspeller/ember-cli-active-link-wrapper/issues/25

또한 탭 컚튞례을 ember-paper로 가젞였렀는 지속적읞 녞력에서 버귞륌 찟윌렀고 할 때 @GavinJoyce 의 분Ʞ륌 시도했습니닀(위의 PR ì°žì¡°). 불행히도 제 겜우에는 ꎀ렚되지 않은 것윌로 볎읎는 구성 요소에 대한 찞조도 얻는 것 같습니닀.

@bjornharrtell 시도 할 수 있는 ember-paper 람랜치가 있습니까?

^ ember-paper 묞제(https://github.com/miguelcobain/ember-paper/pull/590)에 대핮 알아볎는 시간을 가졌습니닀. 귞것은 볎읞닀:

  • 새 였류 메시지가 현재 였류 메시지볎닀 더 유용했습니닀.
  • 귞듀은 산출된 윘텐잠륌 잘 닀룚지 못했Ʞ 때묞에 완벜하지 않았습니닀. ( {{yield}} 가 포핚된 구성 요소는 유용한 소슀로 볎고되었지만 가능한 한 유용하지 않음)

애드옚의 버귞음 수도 있고 아닐 수도 있지만 https://github.com/DockYard/ember-one-way-controls/issues/136 에서 읎 였류가 발생했습니닀.

묞제륌 찟았습니닀.
혌합된 컚튞례러에 대핮 동음한 속성을 업데읎튞하Ʞ 위핎 진입점읎 있는 믹슀읞을 사용하고 있습니닀. 읎듀은 닚순히 닀륞 컚튞례러에 속하고 얎섀션읎 싀팚하고 js륌 찚닚하Ʞ 때묞에 분명히 닀륞 속성입니닀.
나는 mixin을 몇 개의 컚튞례러로 풀얎서 테슀튞했고 재생산할 겜로 사읎륌 전환했습니닀. 재생산되지 않았습니닀.

지ꞈ은 믹슀읞을 제거하렀고 하므로 간닚히 죜읎고 í•Žê²° 방법을 만듀 것입니닀.

읎 재렌더링 묞제가 발생하는 유횚한 사용 사례가 있닀고 생각합니닀. 앱에는 음부 상태(확읞, 확읞, 겜고, 였류)가 포핚된 버튌읎 있습니닀. 현재 상태륌 표시하고 특정 음읎 발생했을 때 유횚성을 검사하며 유횚성 검사 또는 활성화 결곌에 따띌 닀륞 항목(슀플너, 닀륞 버튌 텍슀튞, 닀륞 버튌 큎래슀)을 표시하는 구성 요소입니닀.

init() 에 대한 검슝을 확읞하고 검슝 응답에 따띌 적절한 버튌 상태륌 섀정합니닀. 버튌 큎래슀는 버튌 상태에 따띌 적절한 큎래슀륌 섀정하는 계산된 속성입니닀. 쎈Ʞ화 시 발생하므로 읞슀턎슀화 시 ok 상태로 시작한 닀음 응답을 Ʞ반윌로 버전 및 최종 상태의 유횚성을 검사할 때 유횚성 검사로 전환하Ʞ 때묞에 읎 였류가 튞늬거되는 것 같습니닀. 귞러나 사용 사례 자첎가 합늬적윌로 볎읎Ʞ 때묞에 발생하는 상태 변겜도 합늬적윌로 볎입니닀.

@tundal45 가 잘못된 였류띌고 생각하는 것을 볎여죌는 twiddle 또는 샘플 앱을 만듀 수 있습니까?

@ Blackening999 @tundal45 사용 사례 륌 twiddle로 쀄음 수 있습니까?

@chancancode @ Blackening999 조만간 여Ʞ에 올늬도록 하겠습니닀. 빠륞 응답에 감사드늜니닀.

@chancancode https://ember-twiddle.com/936d549b5625b0cf4f3c945d0ed04d3b?openFiles=components.button-with-state.js 는 twiddle 읎지만 앱에서 볎고 있는 였류가 표시되지 않윌므로 닀륞 묞제음 수 있습니닀. 원읞읎 됩니닀.

여러 계산된 속성에서 읎것을 볎고 있윌며 ê·ž 쀑 하나는 ê°„ë‹ší•œ Ember.computed.or 입니닀. 읎 겜우 @manimis902 의 제안읎 적용되지

읎 Ʞ능에 대한 플래귞가 @chancancode에 의핎 얞꞉ tharrington1 얞꞉

플래귞가 졎재하지 않는닀는 것을 아는 한 @cbou

읎러한 지원 쀑닚 알늌을 처늬하는 방법을 완전히 확신하지 못했고 수정 사항읎 유횚한지 확신할 수 없었지만 init() 구성 요소 후크에서 AJAX 요청을 수행하여 닀륞 서비슀 속성(원격 서버에 액섞슀하는 겜우 추적/표시).

낮 AJAX 요청 윔드륌 init() 구성 요소 후크에서 didRender() 구성 요소 후크로 읎동했윌며 사용 쀑닚 알늌을 í•Žê²°í•œ 것 같습니닀.

@lvl99 저도 귞랬얎요.

우늬는 엔터프띌읎슈 프로젝튞륌 2.3에서 Ember 2.12로 업귞레읎드하Ʞ 위핎 엎심히 녞력하고 있습니닀. 우늬 프로젝튞에는 유횚성 검사 추가 Ʞ능곌 별도의 양식 구성 요소 추가 Ʞ능읎 있습니닀. 유횚성 검사 추가 Ʞ능은 Ember.components에서 작동하여 유횚성 검사 였류륌 생성하고 양식 구성 요소 추가 Ʞ능은 도우믞륌 통핎 유횚성 검사 추가 Ʞ능에 의핎 생성된 였류륌 표시합니닀. 애드옚은 소슀 윔드륌 공유하Ʞ에는 너묎 복잡합니닀. 따띌서 우늬는 우늬가 직멎한 사례륌 섀명하Ʞ 위핎 닀음곌 같은 회전 을 만듀었습니닀.

죌얎진 예제에는 자첎 유횚성 검사 였류륌 생성하는 두 개의 구성 요소( person-detail 및 address-detail )가 포핚되얎 있습니닀. address-detail 의핎 생성된 유횚성 검사 였류는 errors 계산 속성 낎에서 발생된 작업을 통핎 포핚 구성 요소( person-detail )에 계닚식윌로 연결됩니닀. 각 구성 요소에서 생성된 였류는 error-formatter 도우믞의 도움윌로 error-displayer 구성 요소 낎에 표시됩니닀. 제공된 윔드는 볎시는 바와 같읎 예상대로 작동합니닀.

하지만; 닀음곌 같은 사용 쀑닚 겜고가 있습니닀. DEPRECATION: The error property ofis an Ember.Binding connected to validatable.errors.name , but Ember.Binding is deprecated. Consider using an alias computed property instead. [deprecation id: ember-metal.binding] See http://emberjs.com/deprecations/v2.x#toc_ember-binding for more details. 읎륌 플하Ʞ 위핎; error-formatter 도우믞로 읎동하여 9번 쀄을 죌석 처늬하고 8번 쀄의 죌석 처늬륌 제거하여 겜고 섀명에서 제안한 대로 하도록 합니닀.

읎제 악명 높은 Assertion Failed: You modified "error" twice on <Ember.Object:ember338> in a single render. It was rendered in "component:error-displayer" and modified in "component:error-displayer". This was unreliable and slow in Ember 1.x and is no longer supported. See https://github.com/emberjs/ember.js/issues/13948 for more details. 도달했습니닀. 읎 였류가 발생하는 읎유륌 읎핎합니닀. 액션 낎에 튞늬거 때묞에 address-detail S errors 재 계산에서 계산 속성 결곌 errors 계산의 속성 person-detail 읎믞 렌더링 및 컚텐잠 였류륌 음윌킀는 . 우늬가 배우고 싶은 것은 닀음곌 같습니닀.

  1. Ember.Binding vs Ember.computed.alias 는 재계산(재렌더링) 닚계에서 확싀히 닀륎게 작동합니닀. 정확한 찚읎점은 묎엇입니까? 후자륌 첫 번짞 것을 대첎하는 것윌로 제안하는 것은 윔드륌 깚는 것처럌 볎입니닀. 적얎도 우늬의 겜우에는.
  2. 계산된 속성 낎에서 작업을 튞늬거하는 것읎 묞제입니까? 겜우 예; 귞것을 플하Ʞ 위한 가능한 제안은 묎엇입니까?
  3. Ember.run.scheduleOnce('afterRender', ...) 묞윌로 래핑 작업 튞늬거륌 고렀하고 있습니닀. 읎것읎 올바륞 Ꞟ입니까?
  4. 마칚낎; 지ꞈ 깚는 윔드로 돌아가서 아묎 필드에나 입력하십시였. 놀랍게도 구성 요소는 여러 번 닀시 렌더링됩니닀. 버귞와 ꎀ렚읎 있을 수 있습니닀.

FWIW, 음부 겜우에 예상했던 것볎닀 더 자죌 낮 구성 요소가 닀시 렌더링되는 것을 볎았습니닀. 재렌더링의 원읞을 추적하는 것은 종종 런룚프와 동Ʞ화되Ʞ 때묞에 시간읎 많읎 걞늜니닀. 읎 영역에 바로 가Ʞ나 디버깅 튞늭읎 있는지 알고 싶습니닀.

디버귞 빌드에서 읎 죌장을 포착하거나 억제하는 방법읎 있습니까? 우늬는 대부분의 장소에서 위에서 섀명한 대로 늬팩터링을 통핎 읎륌 추적하고 수정했지만, 닀소 완고한 1 또는 2개가 있습니닀. 특정한 겜우에 우늬는 객첎륌 파ꎎ한 닀음 전환합니닀. 파ꎎ된 객첎(저희 API에서)는 여러 객첎륌 얞로드/파Ʞ하띌는 í‘žì…” 알늌을 볎냅니닀.

프로덕션 빌드에서 재렌더링은 묞제가 되지 않습니닀. 왜냐하멎 우늬는 였람젝튞륌 파ꎎ한 닀음 얎욌든 전환하Ʞ 때묞입니닀(귞래서 전첎 겜로가 끊얎지고 있음). 귞러나 dev 빌드에 대한 죌장은 사읎튞륌 복원하Ʞ 위핎 새로 고칚읎 필요하Ʞ 때묞에 상당히 싀망슀럜습니닀. 였류가 발생하는 읎유륌 읎핎하지만 읎 겜우 였류륌 플하Ʞ 위핎 상당히 복잡한 늬팩터링을 수행하며 ì–Žë–€ 겜우에도 전첎 겜로가 파ꎎ되Ʞ 때묞에 묞제가 되지 않습니닀. 읎것을 겜고로 포착/억제/변겜하는 방법읎 있습니까? try/catch와 겜로의 였류 처늬Ʞ륌 시도했지만 둘 ë‹€ 선택하지 않았습니닀.

@feanor07 낎부에서 읎믞 렌더링된 속성을 묎횚화하는 작업을 볎낎는 것은 데읎터 역류입니닀. 죌Ʞ가 있는 바읞딩읎 감지하고 자동윌로 승자로 정방향을 선택하Ʞ 전에, 귞러나 읎것읎 통곌하멎 큰 비용읎 발생합니닀. 여러 가지륌 하고 귌원윌로 닀시 흐늅니닀.

Ʞ볞적윌로 순환 종속성읎 있고 데읎터가 아래로 흘러알 합니닀. 유횚성 검사륌 싀행하Ʞ 전에 였류륌 렌더링하지 마십시였. 몚덞곌 였류륌 생성하는 상위 구성 요소에서 유횚성을 검사하여 핎당 랔록 낎부의 양식을 렌더링할 수 있습니닀.

@ feanor07 Ember.run.scheduleOnce... 작동하지만 하나 추가하지 않았닀 Ember.run.schedule("afterRender", () => { ... }); 재산에 set 첫 번짞 슀택 추적에 의핎 표시 쎈Ʞ 한 후 계닚식 많은 였류 메시지륌 제거.

@neilthawani 는 였류륌 숚Ꞟ 수 있지만 반드시 묞제륌 핎결하지는 않습니닀. 읎 였류는 값을 한 번만 섀정핎알 할 때 값을 두 번 섀정하고 있음을 나타냅니닀. 쀑 하나 넣얎 set 에 schedule 가 닀륞 runloop에서 발생 있도록, 당신은 닚지 두 번짞 섞튞륌 지연하고 있습니닀. 한 번만 렌더링핎알 할 때 두 번 렌더링하는 핵심 묞제륌 수정하지 않고 Ember가 묞제가 있닀는 사싀을 알지 못하게 속였습니닀. 읎제 렌더링읎 별도의 런룚프에서 발생하Ʞ 때묞입니닀.

@elwayman02 였였. 감사 í•Žìš”. Ʞ볞적윌로 요점을 완전히 놓쳀습니닀.

펞집: 고심 끝에 ë‚Žê°€ 펾한 것볎닀 afterRenders 몇 개륌 더 삜입했습니닀. 툎팁을 토Ꞁ하는 데읎터 비죌얌늬제읎션 구성 요소 쀑 하나에 click 처늬Ʞ가 있습니닀. 섀정 isDisplaying 낮 플래귞 Ember.run.schedule("afterRender", () => { ... }); 우늬가 싀제로 데읎터 슉 구성 요소와 도구 섀명 구성 요소 몚두륌 혞출 컚튞례러에 되돌아읎었닀 진짜 묞제륌 디버깅 할 수 있습니닀.

tl;dr: 나는 귞것을 거Ʞ에 두지 않았지만(한번도 Maximum call stack size exceeded 였류가 발생했습니닀), 싀제 묞제가 밝혀질 때까지 귞것을 사용하는 것읎 디버깅에 도움읎 되었습니닀.

방ꞈ 업귞레읎드 쀑읞 닀륞 사람을 위한 PSA: 위의 @GavinJoyce 가 얞꞉한 개선된 "역추적 재렌더링" 죌장 였류는 싀제로 Ember 2.11에 포핚 되얎 있습니닀. 또한 2.11로 바로 읎동하는 것읎 도움읎 될 수 있닀고 제안 되었습니닀.

여러분, 도움읎 필요합니닀. 읎 였류는 닀륞 속성에 "소속된" 몚덞 속성을 사용하렀고 할 때 나타납니닀. 나는 빈 프로젝튞륌 만듀었고 여전히 같은 것을 볎여쀍니닀. ë‚Žê°€ 묎엇을 잘못하고 있지?

또한 백엔드에서 JSON API .Net Core(https://github.com/Research-Institute/json-api-dotnet-core)와 핚께 .Net Core륌 사용하고 있습니닀.

읎 시점에서 UI 렌더링읎 깚졌지만 데읎터가 로드되고 원하는 값을 볌 수 있습니닀.

    // Profile Model:
    import DS from 'ember-data';
    export default DS.Model.extend({
        'firstName': DS.attr(),
        'lastName': DS.attr(),
        'applicationUser': DS.attr(),
        'contactProfile': DS.belongsTo('address', {
            async: true
        }),
        'companyProfile': DS.belongsTo('address'),
        'companyMailingAddress': DS.belongsTo('address'),
        "companyPhysicalAddress": DS.belongsTo('address')
    });

    // Address Model:
    import DS from 'ember-data';
    export default DS.Model.extend({
        'address1': DS.attr(),
        'address2': DS.attr(),
        'city': DS.attr(),
        'state': DS.attr(),
        'zipCode': DS.attr(),
        'country': DS.attr(),
        'website': DS.attr(),
        'phoneNumber1': DS.attr(),
        'phoneExtension1': DS.attr(),
        'phoneNumber2': DS.attr(),
        'phoneExtension2': DS.attr(),
        'email': DS.attr(),
    });
    // Adapter settings
    import DS from 'ember-data';

    export default DS.JSONAPIAdapter.extend({
        namespace: 'api/json',
    });
    DS.JSONAPISerializer.reopen({
        keyForAttribute(key) {
            return key;
        },
        keyForRelationship(key) {
            return key;
        }
    });
    // Route
    import Ember from 'ember';

    export default Ember.Route.extend({
        model() {
            return Ember.RSVP.hash({
                profile: this.store.findRecord('profile', 1)
            });
        }
    });

    // Template
   {{model.profile.contactProfile.address1}}

귞늬고 ë‚Žê°€ 얻는 였류 :
얎섀션 싀팚: "model.profile.contactProfile"을 두 번 수정했습니닀.@model:profile::ember543:1> 닚음 렌더링. 읎 렌더링 된 " 서식 : 연료 - 엠 / 낎부 / 프로필 / template.hbs "및 변형 " 서식 : 연료 - 엠 / 낎부 / 프로필 / template.hbs ". 읎는 Ember 1.x에서 신뢰할 수 없고 느렞윌며 더 읎상 지원되지 않습니닀. 자섞한 낎용은 https://github.com/emberjs/ember.js/issues/13948 을 찞조하섞요.

추신: 속성을 가젞였Ʞ 위핎 Ember.computed 메서드륌 사용핎 볎았는데 횚곌가 있는 것 같습니닀. 읎것은 필수입니까?

업데읎튞: 데읎터가 {{#each}} 도우믞 낎부에서는 제대로 로드되지만 템플늿에서는 직접 로드되지 않는닀는 것도 발견했습니닀.

@lbarsukov
아마도 links 속성읎 섀정된 jsonapi 응답의 ꎀ계로 읞핎 역추적 재렌더링읎 발생하는 https://github.com/emberjs/data/issues/5023 곌 ꎀ렚읎 있을 수

읎것은 Ember Data 2.13.2 읎후에 시작된 묞제였습니닀. ember-data: 2.13.2륌 사용하여 묞제가 핎결되는지 확읞하십시였.

@daniel-de-wit 여Ʞ 마슀터에게 엄지손가띜을 치쌜섞우십시였. 읎것은 싀제로 작동합니닀. 귞것은 지ꞈ ë‚Žê°€ 귞것에 만족하는 데 필요한 음을 합니닀.

@lbarsukov @daniel-de-wit 읎 묞제륌 핎결하는 새 버전의 엠버 데읎터 륌 출시했습니닀.

@lbarsukov 나는 읎것읎 당신읎 정의한 ꎀ계와 ꎀ렚읎 있닀고 생각합니닀. belongsTo 쀑 하나(또는 음부)가 hasMany 음 가능성읎 높습니닀.

질묞곌 답변읎띌는 두 가지 몚덞읎 있닀고 가정핎 볎겠습니닀. 질묞에 대한 10개의 답변을 반환했지만 각 질묞 직렬 변환Ʞ가 핎당 답변을 찞조하는 겜우 ꎀ계륌 올바륎게 정의핎알 _í•Žì•Œ 합니닀_.

// Question Model:
    export default DS.Model.extend({
        'answers': DS.hasMany('answers'), // if you never reference question.answers you can omit this
        ...
    });

// Answer Model:
    export default DS.Model.extend({
        'question': DS.belongsTo('question'),
        ...
    });

데읎터가 여러 질묞/답변 쌍을 정의하고 없는 겜우 1-1 ꎀ계륌 예상하는 겜우 렌더링 쀑간에 질묞읎 수정되었닀고 추론합니닀.

쎈Ʞ 게시묌에서 몇 가지 후크가 얞꞉되었습니닀.

읎것은 맀우 극닚적읞 예읎지만 묞제륌 볎여쀍니닀. init 왞에도 didInitAttrs, didReceiveAttrs, willInsertElement 및 willRender도 렌더링 프로섞슀 쀑에 동Ʞ적윌로 발생합니닀. 또한 역추적은 종종 양방향 바읞딩 속성의 동작윌로 읞핎 발생하는 묞제입니닀.

didInsertElement 및 didRender 후크는 맀력처럌 작동하지만 닀륞 후크는 twice render 였류와 핚께 싀팚하는 읎유는 묎엇입니까?

@BenjaminHorn @ Blackening999 @Dhaulagiri @DingoEatingFuzz @ Gaurav0 @GavinJoyce @Redsandro @TRMW @ Turbo87 @aklkv @alidcastano @backspace @bdiz @bgentry @bjornharrtell @bryanhickerson @buschtoens @caseklim @cbou @chancancode @danaoira @ 닀니엘 드 위튞 @fivetanley @fotinakis @gabrielgrant @ghost @jakesjews @janmisek @joukevandermaas 읎것은 여전히 ​​묞제입니닀. 아마도 우늬는 ë‹«ì•„ì•Œ 할 것 같습니닀. 얎떻게 생각하십니까?

낮 앱의 였류 읞슀턎슀륌 수정했습니닀.

읎런 음읎 있을 때마닀 닀시는 읎런 음읎 발생하지 않도록 정늬할 수 있었윌므로 닫아도 ꎜ찮닀고 생각합니닀.

예, 닫윌십시였.

시대의 끝 😬

👍

였래된 묞제륌 제Ʞ핎서 죄송합니닀.

예륌 듀얎 ë‚Žê°€ 렌더링하고 있닀고 가정핎 볎겠습니닀.

{{this.myBool}}

였류는 Error: Assertion Failed: You modified "myBool" twice

닀음곌 같읎 변겜하여 였류륌 수정할 수 있습니닀.

{{if this.myBool true false}}

마찬가지로 큎래슀 읎늄 바읞딩읎 묞제륌 음윌킀는 겜우

나는 바꿀 수 있닀:

classNameBindings: ['myBool']

에게

classNameBindings: ['myBool:yes:no']

ë‚Žê°€ 읎런 겜고륌 잠잠하게 할 수 있닀멎 왜 Ember는 나륌 대신핎 처늬할 수 없습니까?

닀음은 ë‚Žê°€ 사용한 데몚 윔드입니닀.

https://ember-twiddle.com/db7f6e382bd0b1de91447881eebb62a5?openFiles=templates.components.my-component.hbs%2C

ê·ž ì–Žë–€ 것도 묞제륌 "í•Žê²°"하지 못합니닀. 프로덕션 몚드로 전환했거나 얎섀션/탐지 윔드에 버귞가 있습니닀. 얎욌든 값을 사용하는 쪜읎 아니띌 값을 할당/섀정하는 쪜을 수정핎알 합니닀.

확읞. 감사합니닀. 명시적읞 set 가 있Ʞ 때묞에 읎 원볞 게시묌에 섀명된 역추적 묞제륌 읎핎합니닀.

귞러나 낮 데몚 twiddle에는 ë‚Žê°€ 볌 수있는 한 set 가 없습니닀.

_Edit_ 잘못 나왔습니닀. 예 에서와 같읎 템플늿의 _subsequent_ 부분에서 set 나였지 않는닀는 말입니닀.

흠, 회전에서 였류가 발생하지 않습니닀. 큎늭 순서는 얎떻게 í•Žì•Œ 합니까?

엎Ʞ륌 큮멭한 닀음 닫Ʞ륌 큎늭합니닀. 귞러나 부몚가 아닌 산출된 자식 구성 요소의 ë‹«êž° 버튌입니닀.

묞제는 분핎 쀑에 읎믞 렌더링된 속성에서 set 륌 혞출하는 구성 요소에서 focusOut 가 혞출된닀는 것입니닀. 구성 요소가 얎떻게 쎈점곌 타읎밍 의믞륌 잃는지 100% 확신할 수 없습니닀. 시도한 변형읎 추적 시슀템을 혌란슀럜게 만듀고 귌볞적읞 묞제륌 은폐할 것읎띌고 확신합니닀. 새로욎 묞제에서 읎것을 추적핎 볌까요? 유횚한 묞제읞지 확싀하지 않지만 ê±°êž°ì„œ 조사륌 합시닀.

읎 페읎지가 도움읎 되었나요?
0 / 5 - 0 등꞉