5

残り火をいじってみると、モデルがコントローラーのcontentプロパティに保存されている場合もあれば、モデルがコントローラーで直接利用できる場合もあることがわかりました。しかし、これが事実であるとき、私は理解していません。

私のember MVCを組み立てたときに見つけた例で説明しましょう。

セットアップ A - 開始

  • Memberカスタムオブジェクト、対応するMemberRouteMemberViewクラス、および という名前のテンプレートを定義しましたmember
  • オブジェクトには、などのMember属性がありました。idnickname
  • : フォームのコントローラーMemberControllerは定義されていないため、ember の慣例により、独自にコントローラーを提供します。

セットアップ B - カスタマイズ

  • セットアップ A と同じですがMemberController、テンプレート内からトリガーされるいくつかのアクション メソッドを含む定義済みがあります。

奇妙な振る舞い(私が完全に理解していないもの)

  • セットアップ A では、Memberの属性を{{id}}orで直接参照できます{{nickname}}
  • セットアップBでは、{{content.id}}またはを使用する必要があります{{content.nickname}}

emberのドキュメントに記載されているようにMemberView

setupController : function(controller, member) {
    controller.set('content', member);
},

では、なぜ違いがあり、どこに違いがあるのか​​ を理解するのを手伝ってくれる人はいますか? 現在、私の推測は次のいずれかです

  • テンプレートのコンテキストが異なること (おそらく、コントローラーのセットアップに欠落しているコード部分がありますか?)

また

  • ember によって自動的に提供されるデフォルトのコントローラーには、カスタマイズされたコントローラーでは直接利用できない追加の魔法があります。

これを理解するための助けは大歓迎です。ここまで来るのにかなりの時間がかかりました。最初は、requireJS を使用したプロジェクトのセットアップによって導入されたモジュール化ではないかと考えました (まあ、それはまだ影響があると思います)。Ember は v1.0pre4 です。

前もって感謝します!パトリック

4

2 に答える 2

8

では、なぜ違いがあり、どこに違いがあるのか​​ を理解するのを手伝ってくれる人はいますか? 現在、私の推測では、テンプレートのコンテキストが異なるか (コントローラーのセットアップにコード部分が欠けている可能性がありますか?)、または ember によって自動的に提供されるデフォルトのコントローラーに、直接的ではない追加の魔法があるかのいずれかです。カスタマイズされたコントローラーに利用できます。

コードを見ずに確実に言うのは難しいですが、私の最善の推測は、あなたのMemberControllerextends Ember.Controller. (このシナリオで) ember によって提供されるデフォルトはEmber.ObjectController. それが必要な場合は、MemberController の定義を次のように変更します。

App.MemberController = Ember.ObjectController.extend({
  myProperty: 'value'
});

objectController は、そのプロパティへのプロキシとして機能しcontentます。通常、これは ember モデルです。したがって、正しく配線されていれば、'content' プロパティを介してモデルにアクセスする必要はありません。次のようなものが表示された場合:

{{content.id}} or {{content.nickname}}

これは、ObjectController に変更する必要があるという兆候です。EMBER ガイドを参照してください: 単一のモデルを表す! 詳細な説明については。

于 2013-01-23T23:45:50.653 に答える
0

anObjectControllerは、コントローラのコンテンツに設定されたオブジェクトへのプロキシとして機能します。コントローラーが定義されていない場合、Ember はコントローラーを作成し、デフォルトでそのコンテンツをmodel() functionルート内の によって返されるオブジェクトに設定します (定義されている場合)。独自のコントローラーを定義しても、Ember にコントローラーを定義させても、動作は同じでなければなりません。

テンプレートのデフォルトのコンテキストは、コントローラー自体this = an instance of your controller or the generated oneです。そのコンテキストでニックネームにアクセスしようとすると、Ember は最初にコントローラー自体に対して解決を試みます。何も見つからない場合は、そのコンテンツ、つまり既にコントローラーのコンテンツに手動で設定されている場合はオブジェクトに対して解決します。

最後に、model() function動的 URL を使用している場合を除き、Routeには のデフォルトの実装はありませんsay /foo/id that resolves against /foo/:id。Ember は提供された ID を使用して、提供された ID を持つ Foo オブジェクトをロードし、model() 関数にデフォルトの実装を提供します。最終的には同じメカニズムに要約されますが、便宜上自動化されているだけです。

これを聞いて、Ember によって物事がどのように自動化されているかについての洞察を深めることをお勧めします。しかし、表示されるコンテンツに関しては、コントローラーのコンテンツを手動で配線する必要がある魔法はありません。

于 2013-01-24T00:03:01.037 に答える