CheeseController クラスが作成され、Cheese ルートをアクティブにすると、そのクラスのインスタンスが作成されます。これは、ハンドルバー テンプレートでコントローラーと対話するときに実際に触れるものです。
はい、まさにそれが起こります。Ember は App.CheeseController のシングルトン インスタンスを作成し、ハンドルバー テンプレートをレンダリングするときにコンテキストとして提供します。
そのインスタンス化されたオブジェクトに JavaScript コンソール内から直接アクセスすることは可能ですか?
はい。JavaScript コンソールからこれを行う最善の方法は{{debugger}}
、テンプレートのハンドルバー ヘルパーを使用することです。これにより、テンプレートのコンテキストで JS デバッグ コンソールが開きます。
<script type="text/x-handlebars" data-template-name="cheese">
{{debugger}}
</script>
デバッガーが開いていると、インスタンス化されたコントローラー シングルトンに としてアクセスできるthis
ため、のthis.toString()
ようなものが返されます<App.CheeseController:ember225>
。
(または私のプログラム内から)?
プログラムのどの部分に依存します
- ルートから: 使用
this.controllerFor('cheese')
- モデルから: いいえ。モデルからコントローラーにアクセスしないでください。
- 別のコントローラーから: 別のコントローラーで依存関係を宣言すると、プロパティを介して別のコントローラーから
needs: ['cheese']
シングルトンApp.CheeseController
にアクセスできるようになりますcontrollers.cheese
。コントローラーの「ニーズ」依存関係を自動的に合成するを参照してください。
- テンプレートから:
needs
配列を使用してテンプレート コントローラーからの依存関係を宣言すると、テンプレート内からチーズ コントローラーは次の場所にあります。{{controllers.cheese}}
ember コンテナーを介して CheeseController インスタンスにアクセスすることもできますが、そうしないでください。コンテナーは、公開 API を意図したものではありません。最近の Ember の更新により、Ember へのアクセスが多少厄介になりました。これは、グローバル定数を使用してインスタンスにアクセスするとカプセル化が壊れるためです。コンソールでは問題ありませんが、アプリケーション コードでは避ける必要があります。詳細については、「App.container はパブリック API になることを意図していなかった」を参照してください。
もっと一般的に言えば、Ember が自動的にライブにするオブジェクトはどこにあるのでしょうか? 内部的に ember は、コンテナー内のコントローラー シングルトンをキャッシュします。もちろん、これはパブリック API の一部ではありませんが、内部でどのように機能するかについて興味がある場合は、 container_test.jsと
What is the Purpose of the Ember.Container を確認してください。