10

私の理解は、私が走るとき

App.CheeseController = Ember.Controller.extend({ type:"brie"});

クラス CheeseController が作成され、Cheeseルートをアクティブにすると、そのクラスのインスタンスが作成されます。これは、ハンドルバーテンプレートでコントローラーと通信するときに実際に触れるものです。

そのインスタンス化されたオブジェクトにjavascriptコンソール内から(または私のプログラム内から)直接アクセスすることは可能ですか?より一般的には、Emberが自動的に作成するオブジェクトはどこにありますか?

4

1 に答える 1

20

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.jsWhat is the Purpose of the Ember.Container を確認してください。

于 2013-01-24T17:26:12.197 に答える