ember-cliアプリケーションを最新のイテレーションに更新するという長いスローガンを乗り越えています。私たちは非常に遅れました。私はインスタンス初期化子が導入された段階にあり、これが現在特定の初期化子を実装した方法を壊そうとしていると感じています。
export function initialize(container, application) {
var store = container.lookup('store:main');
// We need a basket to be present when
// the application loads. Wait for this
// to happen before continuing.
application.deferReadiness();
store.findOrCreateRecord('order', basketToken).then(function(basket) {
container.register('basket:main', basket, { instantiate: false });
application.inject('controller:basket', 'model', 'basket:main');
// Let the application know we have
// a basket and can continue.
application.advanceReadiness();
});
}
現在推奨されているのは、これを「通常の」初期化子に分割してバスケットオブジェクトを登録し、インスタンス初期化子を分割してストアを取得してAPIサーバーを呼び出すことです。ただし、これを行うと、インスタンス初期化子内のレジストリにアクセスして、Promiseから返されたオブジェクトを登録し、それをコントローラーに挿入することができなくなります。私はこれをすべて間違って考えていると思いますが、頭を包むことができませんでした。これを更新することでどのようにすべきか提案はありますか?
他の人がイニシャライザーを理解するのを助けるための答えとして、ここに@tomdaleの説明を投稿するのは合理的だと思います。
@tomdale: "定義上、インスタンス初期化子はアプリの起動が完了した後にのみ実行されるため、インスタンス初期化子でアプリの準備を延期することはできません。
アプリケーション起動のセマンティクスに関するサイドバー:「アプリの準備」(、deferReadiness(
)およびadvanceReadiness()
)は、アプリケーションのすべてのコードがロードされているかどうかを示します。すべてのコードが読み込まれると、アプリケーションである新しいインスタンスが作成されます。
言い換えると、ブラウザーで実行されているEmberアプリケーションのライフサイクルは次のとおりです。
JavaScriptファイルが評価されるときに、アプリケーションにクラスを登録します(例App.MyController = Ember.Controller.extend(…);
)。
Emberは、<script>
タグを介して含まれるすべてのJavaScriptがロードされたことを確認するためにDOMの準備ができるのを待ちます。
deferReadiness()
。advanceReadiness()
。Application
準備ができていると言います。つまり、アプリを構成するすべてのクラス(コンポーネント、ルート、コントローラーなど)が読み込まれることをEmberに伝えました。実行する必要のあるランタイムセットアップがあるためにUIの表示を遅らせたい場合(たとえば、アプリの実行を開始する前にWebSocketを開きたい場合)、正しい解決策はのbeforeModel/model/afterModel
フックを使用することApplicationRoute
です。これらのフックはすべて、子ルートが解決されるまで評価されないようにするpromiseを返すことができます。
deferReadiness()
イニシャライザでの使用は、多くの人が頼るようになった不幸なハックです。ルーターのモデルpromiseチェーンとは異なり、エラーやサブステートの読み込みなどを壊すため、これをハックと呼びます。イニシャライザーでレンダリングをブロックすることにより、IMOは、Promiseが遅いか拒否された場合に読み込みまたはエラーのサブステートが表示されず、私が見たほとんどのコードにエラー処理コードがないため、ユーザーのエクスペリエンスが低下します。まったく。これにより、白い画面が空白になり、何か問題が発生したことをユーザーに通知せずにアプリが破損する可能性があります。」
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加