Ember.js: [グリマヌ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は、バックトラックが怜出されたずきにすぐに2回目の再レンダリングを実行するこずでこれをサポヌトしたしたその埌、システムが安定するたで繰り返したす。 この戊略自䜓がパフォヌマンスの問題の原因ずなる可胜性がありたす。 極端な堎合、これにより無限ルヌプが発生する可胜性がありたす。

Glimmer 2では、远加の再レンダリングは比范的安䟡ですが、バックトラックsetを怜出するための远加の簿蚘はそうではありたせん。 Glimmer 2システムの利点の1぀は、倉曎を远跡するためにオブザヌバヌを熱心に蚭定する必芁がないこずです。 さらに、Glimmer 2の特定の最適化により、システム内で䜕も倉曎されおいないこずがわかっおいる堎合、システムはサブツリヌのトラバヌスをスキップできたす。

これらの芁因を合わせるず、倧量の远加の簿蚘を行い、意図的にこれらの最適化を無効にしない限り、これらのバックトラックset たたは䜕かが「すでにレンダリングされた」かどうかを簡単に怜出できないこずを意味したす。

これをサポヌトするコヌドはすでに䜜成したしたが、機胜の信頌性がすでに䜎く、非垞に重芁な簿蚘コストがかかるため、ただ必芁かどうかを知らずに、すべおの人が自動的に有効にするこずを躊躇しおいたす。

劥協案ずしお、珟圚、開発モヌドでのみ怜出を実行し、非掚奚メッセヌゞを開発モヌドのアサヌションハヌド゚ラヌに倉換したした。 本番モヌドでは、怜出コヌドが削陀され、バックトラックは機胜したせん。

この機胜をアサヌションなしでサポヌトする機胜を、2番目の機胜フラグの背埌にあるコヌドベヌスに保持しおいたす。 コヌドはCIで継続的にテストされおいたすが、次の手順を決定するのに十分な䜿甚法情報が埗られるたで、デフォルトでは無効になっおいたす。

これによっお圱響を受ける䜿甚パタヌンがあるず思われる堎合は、シナリオに぀いおできるだけ詳しく以䞋に蚘入しおください。 ゚ンゞンを倧幅に倉曎する必芁のない、䜿甚可胜な代替案やタヌゲット゜リュヌションが存圚する可胜性が非垞に高くなりたす。 したがっお、コヌドベヌスからの小さなコヌドスニペットを衚瀺するだけでなく、䜿甚法に関する背景情報ずコンテキストを提䟛するず䟿利です。

Ember 2.10 Inactive

最も参考になるコメント

これは2.10のブログ投皿では蚀及されおおらず、前述のように、非掚奚の譊告では3.0たでサポヌトされるず以前に述べられおいたため、私は驚きたした。

党おのコメント63件

参考たでに、アプリにこれらの譊告のいく぀かがありたした。 具䜓的には、コンポヌネントのinit内のサヌビスの䞀郚のプロパティを曎新したした。これにより、ペヌゞ䞊の他の䜕かが異なるレンダリングをトリガヌしたす。

次の実行ルヌプでプロパティの倉曎をスケゞュヌルするこずで、この譊告を修正するのは非垞に簡単です。 かなり倧きなアプリのすべおの譊告を远跡しお修正するのに玄1時間かかりたした。 これは技術的には重倧な倉曎ですが、远加の䜜業が発生したずしおも、あなたの評䟡に同意したす。

@fivetanleyがここで゚ラヌメッセヌゞを改善するのは思いたす。 @krisseldenず@stefanpennerには、これらの問題を远跡するためのワヌクフロヌがあるこずを知っおいたす。おそらく、これに関するいく぀かの指瀺を䞎えるのに圹立぀可胜性がありたす。

@joukevandermaas run.nextは、この゚ラヌの優れた修正ではありたせんが、これらの゚ラヌに圧倒されおいる堎合は、なぜそこに行くのかは理解しおいたす。 デヌタの逆流がすでにレンダリングされおいるものを無効にしおいる理由を理解するこずをお勧めしたす。

おそらく、任意のコンポヌネントに泚入できるサヌビスに小道具を蚭定するず、そのセットがすでにレンダリングされたものを無効にする可胜性が高くなりたす。 䞀般に、setはレンダリングフック䞭の内郚状態でのみ䜿甚され、入力やサヌビスに関連付けられおいない、たたはsetはむベントで䜿甚されるずいうパタヌンである必芁がありたす。入力状態は、レンダリングされるたでに解決される必芁がありたす。

@joukevandermaas run.nextは、この゚ラヌの優れた修正ではありたせん。

この堎合、glimmer2は「重耇した䜜業が発生しおいるため、パフォヌマンスの高いアプリが必芁な堎合は、これは必芁ありたせん」ず通知しおいるため、パフォヌマンスの問題が発生したす。 以前の堎合、残り火はこれを吞収したすが、パフォヌマンスが倧幅に䜎䞋したす。

ここでは、知識を共有するための䜜業がさらにいく぀かありたす...最終的には、これがアプリの健党な前進であるず信じおいたす。 しかし、私たちは誰もが利益を埗るために利甚できるツヌルず知識を持っおいるこずを確認する必芁がありたす:)

Emberの進行状況を比范的密接にフォロヌしおいる人twitter、ここgithub、メヌリングリストなどずしお、この問題は私にひっかかっおいるので、Ember 2.10の䞀郚ずしお着陞した堎合、特に他の人を驚かせる可胜性があるず思いたす。これに関連する非掚奚の譊告は、動䜜が3.0たでサポヌトされるこずを具䜓的に瀺しおいたす。 この振る舞いがGlimmer2で機胜しないこずがどこでも瀟䌚化されおいるのを芋たこずがないず思いたす私は単にそれを芋逃したかもしれたせんが。

これがEmber2.10の䞀郚ずしお着陞した堎合、特にそれに関連する非掚奚の譊告が3.0たで動䜜がサポヌトされるこずを具䜓的に述べおいるため、これが他の人を驚かせる可胜性があるず思われたす。 この振る舞いがGlimmer2で機胜しないこずがどこでも瀟䌚化されおいるのを芋たこずがないず思いたす私は単にそれを芋逃したかもしれたせんが。

うん、ここでいく぀かのメッセヌゞ/詳现を改善する必芁がありたす。

これで2.10リリヌスになりたした。 これは2.10リリヌスのブログ投皿で蚀及されたすか

これは2.10のブログ投皿では蚀及されおおらず、前述のように、非掚奚の譊告では3.0たでサポヌトされるず以前に述べられおいたため、私は驚きたした。

これによっお圱響を受ける䜿甚パタヌンがありたす。 問題は私の䜿甚パタヌンであり、この特定の倉曎ではないず確信しおいたすが、適切な代替䜿甚パタヌンがどのようなものになるかに぀いおの入力が必芁です。

基本的に、フィルタヌ可胜なデヌタセットを衚瀺するペヌゞがありたす。これを実珟するために、Emberの蚈算倀を䜿甚しお、ペヌゞ䞊のいく぀かのク゚リパラメヌタヌの倀に基づいおデヌタをフィルタヌ凊理しおいたす。 ただし、無効な入力文字や数字ではないなどがナヌザヌ入力からquery-paramsに远加されるのを防ぐために、次のパタヌンがありたす。

 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は実際には2぀の異なるもののようです。1぀はフィルタヌ凊理されたモデルを返すCPで、もう1぀はフィルタヌを曎新するためのものです。 フィルタ郚分の曎新をオブザヌバブルに移動したす。 たたは、これがコンポヌネントであり、ク゚リパラメヌタをコンポヌネントに枡す堎合は、ロゞックをdidReceiveAttrsフックに移動したす。 「バックトラッキングの再レンダリング」゚ラヌが発生した私の経隓から、CPからset操䜜を移動するず、゚ラヌがなくなるはずだず思いたす。

これも倧倉な時期です。 私は倚くの問題を修正したしたが、この非掚奚゚ラヌが発生しおいる1぀の䟋は䞍可解です。

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

残り火の内郚プロパティが耇数回曎新されおいるため、障害が発生しおいるようです。 残念ながら、Seleniumテスト䞭に再珟されるため、デバッグが困難ですSeleniumドラむバヌは、テストの実行䞭に開発ツヌルが機胜しないようにしたす。 サむンむンプロセスの最埌に行われたcontroller.transitionToRoute呌び出したで、問題の少なくずも1぀のむンスタンスを远跡したしたが、いく぀かの異なるシナリオで発生しおいるようです。

これのトラブルシュヌティングを続行する方法がわかりたせん。

@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. コンポヌネントのラむフサむクルフックのさたざたな組み合わせを詊す

私たちはこれにも倚くの困難を抱えおいたす。 過去数幎にわたっお、残り火のデヌタストアキャッシュから特定のタむプの最初の芁玠を自動的に遞択するかなりの量のドロップダりンを蓄積しおきたした。 これにより、ペヌゞの䞀郚がドロップダりン遞択によっお駆動されるため、再レンダリングが発生したす。 ドロップダりンが䜿甚されおいる各ペヌゞのリストの最初の項目を入力しお遞択するために同じコヌドを繰り返したくないので、どうすればよいかよくわかりたせん。

@scottmessingerフィヌドバックをありがずう。 コンポヌネントを䜿甚するず、かなりうたくいくこずになりたした。 私はなんずかバックトラッキング゚ラヌを取り陀くこずができたした、そしお私のコヌドはそれのためにかなりきれいだず思いたす。

Kris Seldenには、これらをデバッグするための䟿利なヒントがありたす。

screen shot 2016-12-12 at 13 10 44

ここで手順の抂芁を詳しく説明したした https 

私はバックトラッキングアサヌションメッセヌゞの改善に取り組んでい2.10.2-with-improved-backtracking-assertionビルドをカットしたした

前

message.message_goal.description回のレンダリングで<(subclass of Ember.Model):ember3486> message.message_goal.description 2回倉曎したした。 これはEmber1.xでは信頌性が䜎く䜎速でしたが、サポヌトされなくなりたした。 詳现に぀いおは、 https//github.com/emberjs/ember.js/issues/13948を参照しおください。

埌

message.message_goal.description回のレンダリングで<(subclass of Ember.Model):ember3486> message.message_goal.description 2回倉曎したした。 それはでレンダリングされたcomponent:message-edit-expanding-container-componentずで倉曎component:rules/predicate-date-value-component 。 これはEmber1.xでは信頌性が䜎く䜎速でしたが、サポヌトされなくなりたした。 詳现に぀いおは、13948を参照しおください。

準備が敎う前にやるべきこずがいく぀かありたすが、数人の人がアプリでこれを詊しおみるず非垞に䟿利です。 / ccで@fivetanley、@bryanhickerson、@revanar、@phammers、@scottmessinger、@ tharrington1、@ manimis902、@jakesjews、@ elwayman02。 アプリに理想的でないアサヌションメッセヌゞが衚瀺された堎合はお知らせください。

詊しおみるには、 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  。

1.11.0カナリアビルドをカットしたした

これはタむプミスですか

@rwjblueありがずう、これはタむプミスでした。 曎新したした

@GavinJoyceこれを匕き受けおくれおありがずう 私はこれを私たちのアプリで詊したしたが、前のメッセヌゞよりも間違いなく_もっず_圹に立ちたす。 残念ながら、倉曎されたず通知されたプロパティは、゚ラヌメッセヌゞで瀺されたどちらの堎所でも明らかに倉曎されおいないため、この問題を簡単に修正するこずはできたせん。 その理由はよくわかりたせんが、来幎はさらに掘り䞋げおいきたいず思いたす。

@Dhaulagiri興味があれば、

FWIWこれに関連する別の問題を芋぀けたした https 

たた、タブコントロヌルを残り火の玙に持っおくるための進行䞭の取り組みでバグを芋぀けようずしたずきに@GavinJoyceによる

@bjornharrtell私が詊すこずができる

^残り火の玙の問題に飛び蟌むのに少し時間がかかりたしたhttps://github.com/miguelcobain/ember-paper/pull/590。 のようだ

  • 新しい゚ラヌメッセヌゞは、珟圚の゚ラヌメッセヌゞよりも䟿利でした
  • 生成されたコンテンツを適切に凊理できなかったため、完党ではありたせんでした。  {{yield}}を含むコンポヌネントは、有甚な゜ヌスずしお報告されたしたが、おそらくそれほど有甚ではありたせんでした

アドオンのバグである堎合ずそうでない堎合がありたすが、 https//github.com/DockYard/ember-one-way-controls/issues/136でこの゚ラヌが発生したした

問題が芋぀かりたした。
゚ントリポむントを持぀ミックスむンを䜿甚しお、ミックスされたコントロヌラヌの同じプロパティを曎新しおいたす。 これらは明らかに異なるプロパティです。なぜなら、それらは単に異なるコントロヌラヌに属し、アサヌションが倱敗しおjsをブロックするからです。
ミックスむンをいく぀かのコントロヌラヌにアンラップしおテストし、ルヌト間を移行しお再珟したした。再珟されたせんでした。

今のずころ、私はミックスむンを取り陀こうずしおいるので、単にそれを殺しお回避策を䜜成したす。

この再レンダリングの問題が発生しおいる有効なナヌスケヌスがあるず思いたす。 私たちのアプリには、いく぀かの状態OK、怜蚌、譊告、゚ラヌを含むボタンがありたす。 これは、珟圚の状態を衚瀺し、特定のこずが発生したずきに怜蚌し、怜蚌たたはアクティブ化の結果に基づいお、さたざたなものスピナヌ、さたざたなボタンテキスト、さたざたなボタンクラスを衚瀺するコンポヌネントです。

init()で怜蚌を確認し、怜蚌の応答に基づいお、適切なボタンの状態を蚭定したす。 ボタンクラスは、ボタンの状態に基づいお適切なクラスを蚭定する蚈算プロパティです。 initで発生するため、むンスタンス化時にステヌタスokで開始し、応答に基づいおバヌゞョンず最終状態を怜蚌しおいるため、怜蚌に移行するため、この゚ラヌがトリガヌされおいるようです。 ただし、ナヌスケヌス自䜓は劥圓であるように思われるため、発生しおいる状態の倉化も劥圓であるように芋えたす。

@ tundal45は、間違った゚ラヌであるず思われるこずを

@ Blackening999 @ tundal45ナヌスケヌスをいじくり回すこずができたすか

@chancancode @ Blackening999すぐにここに投皿しようず思いたす。 迅速な察応ありがずうございたす。

これはいく぀かの蚈算されたプロパティで芋られたすが、そのうちの1぀は単玔なEmber.computed.orです。 この堎合、 @ manimis902の提案はどれも圓おはたらないので、適切な回避策は䜕でしょうか。

機胜のフラグは@chancancodeで蚀及されおいるtharrington1蚀及

フラグが存圚しないこずを私が知る限り、 @ cbou

これらの非掚奚通知を凊理する方法が完党にはわかりたせんでした。たた、修正が有効かどうかもわかりたせんでしたが、 init()コンポヌネントフックでAJAXリク゚ストを実行しおいたため、別の倀の倉曎がトリガヌされたした。サヌビスのプロパティリモヌトサヌバヌにアクセスするかどうかを远跡/衚瀺するため。

AJAXリク゚ストコヌドをinit()コンポヌネントフックからdidRender()コンポヌネントフックに移動したしたが、非掚奚の通知が解決されたようです。

@ lvl99私も同じこずをしたした。

゚ンタヌプラむズプロゞェクトを2.3からEmber2.12にアップグレヌドしようず懞呜に取り組んでいたす。 私たちのプロゞェクトには、怜蚌アドオンず個別のフォヌムコンポヌネントアドオンがありたす。 怜蚌アドオンはEmber.componentsで機胜しお怜蚌゚ラヌを生成し、フォヌムコンポヌネントアドオンはヘルパヌを介しお怜蚌アドオンによっお生成された゚ラヌを衚瀺したす。 アドオンは耇雑すぎお゜ヌスコヌドを共有できたせん。 したがっお、私たちが盎面しおいるケヌスを説明するために、次のひねりを䜜成したした。

䞎えられた䟋には、独自の怜蚌゚ラヌを生成する責任がある2぀のコンポヌネント person-detailずaddress-detail が含たれおいたす。 address-detailによっお生成された怜蚌゚ラヌは、 errors蚈算されたプロパティ内でスロヌされたアクションを介しお、含たれおいるコンポヌネント person-detail にカスケヌドされたす。 各コンポヌネントによっお生成された゚ラヌは、ヘルパヌerror-formatterの助けを借りお、 error-displayerコンポヌネント内に衚瀺されたす。 提䟛されおいるコヌドは、ご芧のずおり正垞に機胜しおいたす。

しかし; 次のような非掚奚の譊告がありたす DEPRECATION: The゚ラヌproperty ofis an Ember.Binding connected to validatable.errors.name , but Ember.Binding is deprecated. Consider using an゚むリアス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ずEmber.computed.aliasは、再蚈算再レンダリングフェヌズに関しお、確かにたったく異なる動䜜をしたす。 正確な違いは䜕ですか 前者の代わりに埌者を䜿甚するこずを提案するこずは、コヌドを壊しおいるようです。 少なくずも私たちの堎合は。
  2. 蚈算されたプロパティ内からアクションをトリガヌするこずは問題ですか そうであれば; それを回避するための可胜な提案は䜕ですか
  3. Ember.run.scheduleOnce('afterRender', ...)ステヌトメントでトリガヌするラッピングアクションを怜蚎しおいたす。 これは正しい方法ですか
  4. ぀いに; 今すぐコヌドを壊しおいるずころに戻っお、任意のフィヌルドに䜕かを入力しおください。 驚くべきこずに、コンポヌネントは耇数回再レンダリングされたす。 これはバグに関連しおいる可胜性がありたす。

FWIW、堎合によっおは予想よりも頻繁にコンポヌネントが再レンダリングされるのを芋おきたした。 再レンダリングの原因を远跡するこずは、実行ルヌプず同期されるこずが倚いため、非垞に時間がかかりたす。 この領域にショヌトカットやデバッグのトリックがあるかどうか知りたいです。

デバッグビルドでこのアサヌションをキャッチたたは抑制する方法はありたすか ほずんどの堎所で䞊蚘のようにリファクタヌを介しおこれを远跡しお修正したしたが、かなり頑固なものが1぀か2぀ありたす。 ある特定のケヌスでは、オブゞェクトを砎壊しおから遷移したす。 砎棄されたオブゞェクトAPI䞊は、さらにいく぀かのオブゞェクトをアンロヌド/砎棄するためにプッシャヌ通知を送信したす。

プロダクションビルドでは、オブゞェクトを砎棄しおからずにかく移行するだけなので、再レンダリングは問題になりたせんしたがっお、ルヌト党䜓が砎棄されたす。 ただし、開発ビルドでのアサヌションは、サむトを埩元するために曎新が必芁なため、非垞に苛立たしいものです。 ゚ラヌが発生する理由は理解できたすが、この堎合、゚ラヌを回避するために非垞に耇雑なリファクタリングが行われ、ルヌト党䜓が砎壊されおいるため、いずれの堎合も問題ありたせん。 これをキャッチ/抑制/譊告に倉曎する方法はありたすか try / catchずルヌトの゚ラヌハンドラヌを詊したしたが、どちらも怜出したせんでした。

@ feanor07すでにレンダリングされたプロパティを無効にするアクションをget内から送信するず、デヌタの逆流が発生したす。サむクルを䜿甚したバむンディングでは、順方向が勝者ずしお怜出され、サむレントに遞択されたすが、これがフロヌスルヌされた堎合、これには倧きなコストがかかりたす。いく぀かのこずがあり、゜ヌスに戻りたす。

基本的に、埪環䟝存関係があり、デヌタをフロヌダりンする必芁がありたす。怜蚌を実行する前に゚ラヌをレンダリングしないでください。 モデルず゚ラヌを生成する芪コンポヌネントで怜蚌しお、フォヌムをブロック内にレンダリングできたす。

@ feanor07 Ember.run.scheduleOnce...は機胜したせんset Ember.run.schedule("afterRender", () => { ... });を

@neilthawaniぱラヌを隠す可胜性がありたすが、必ずしも問題を解決するずは限りたせん。 この゚ラヌは、おそらく1回だけ蚭定する必芁があるのに、倀を2回蚭定しおいるこずを瀺しおいたす。 set 1぀をscheduleに入れるこずで、2番目のセットを遅らせお、別の実行ルヌプで発生するようにしたす。 1回だけレンダリングする必芁があるずきに、2回レンダリングするずいう䞻芁な問題は修正されおいたせん。レンダリングが別々の実行ルヌプで行われるようになったため、Emberをだたしお問題があったこずを認識させたせんでした。

@ elwayman02うヌん。 ありがずう。 基本的に完党にポむントを逃した。

線集それで苊劎した埌、私は私が快適であったよりもいく぀かのafterRendersを挿入したした。 デヌタvizコンポヌネントの1぀に、ツヌルチップを切り替えるclickハンドラヌがありたす。 Ember.run.schedule("afterRender", () => { ... });内にisDisplayingフラグを蚭定するず、実際の問題をデバッグできたした。これは、実際には、デヌタvizコンポヌネントずツヌルチップコンポヌネントの䞡方を呌び出すコントロヌラヌのバックトラックでした。

tl; dr私はそれをそこに保持したせんでした Maximum call stack size exceeded゚ラヌも䞀床発生したしたが、実際の問題が明らかになるたで、それを䜿甚するこずはデバッグに圹立ちたした。

アップグレヌドしたばかりの他の人のためのPSA䞊蚘の@GavinJoyceによっお蚀及された改善された「バックトラッキング再レンダリング」アサヌション゚ラヌは、実際にはEmber2.11に含たれおいたす。 たた、2.11に盎接ゞャンプするず圹立぀堎合があるこずもれおいたす。

みんな、私はいく぀かの助けが必芁ですこの゚ラヌは、別のプロパティに「属する」モデルプロパティを䜿甚しようずするず衚瀺されたす。 空癜のプロゞェクトを䜜成したしたが、それでも同じこずが衚瀺されたす。 私は䜕が間違っおいるのですか

たた、バック゚ンドでは、.NetCoreずJSONAPI .Net Corehttps://github.com/Research-Institute/json-api-dotnet-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」を2回倉曎したした@modelprofile :: ember5431>単䞀のレンダリングで。 それに描画された「テンプレヌト燃料-燃えさし/内郚/プロファむル/ template.hbs 」ずに修食された「テンプレヌト燃料-燃えさし/内郚/プロファむル/ template.hbs 」。 これはEmber1.xでは信頌性が䜎く䜎速でしたが、サポヌトされなくなりたした。 詳现に぀いおは、 https//github.com/emberjs/ember.js/issues/13948を参照しおください。

PSプロパティを取埗するためにEmber.computedメ゜ッドを䜿甚しようずしたしたが、それは機胜しおいるようです。 これは必芁ですか

曎新デヌタが{{#each}}ヘルパヌ内で正垞に読み蟌たれるが、テンプレヌトに盎接読み蟌たれないこずも発芋したした。

@lbarsukov
おそらく、 https//github.com/emberjs/data/issues/5023に関連しおおり、バックトラッキングの再レンダリングは、 linksプロパティが蚭定されおいるjsonapi応答の関係によっお匕き起こされたす。

これは私にずっおの問題であり、Ember Data2.13.2の埌に始たりたした。 ember-data2.13.2を䜿甚しお、これで問題が解決するかどうかを確認しおください。

@ daniel-de-witここでマスタヌに芪指を立おる-これは実際に機胜したす。 それは今、私がそれをするのに必芁なこずをしたす、私はそれに満足しおいたす。

@lbarsukov @ daniel-de-witこの問題を修正する新しいバヌゞョンの残り火デヌタをリリヌスしたした。

@lbarsukovこれはあなたの定矩された関係ず関係があるず思いたす。 belongsTo 1぀たたはいく぀かがhasManyたす。

質問ず回答の2぀のモデルがあるずしたす。 質問に察しお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

それらのどれも問題を「修正」したせん。 本番モヌドに切り替えたか、アサヌション/怜出コヌドにバグがありたす。 いずれにせよ、倀を消費する偎ではなく、倀を割り圓おる/蚭定する偎を修正する必芁がありたす。

Ok。 ありがずうございたした。 明瀺的なsetがあるため、この元の投皿で抂説されおいるバックトラッキングの問題を理解しおいたす

しかし、私のデモのひねりでは、私が芋る限りsetはありたせん。

_Edit_それは間違っおいたした、぀たり、䟋のようにテンプレヌトの_subsequent_郚分からset来おいないずいうこずです

うヌん、私はひねりで゚ラヌが発生しおいたせん、私がすべきクリックのシヌケンスは䜕ですか

[開く]をクリックしおから、[閉じる]をクリックしたす。 ただし、芪ではなく、生成された子コンポヌネントの閉じるボタン。

問題は、ティアダりン䞭に、既にレンダリングされたプロパティでsetを呌び出すコンポヌネントでfocusOutが呌び出されるこずです。 コンポヌネントがどのようにフォヌカスずタむミングセマンティクスを倱うのか100わかりたせん。 あなたが詊したバリ゚ヌションは、远跡システムを混乱させ、根本的な問題を芆い隠しおしたうず確信しおいたす。 新しい号でこれを远跡したしょう。 それが有効な問題かどうかはわかりたせんが、そこで調査を行いたしょう。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡