model
プロパティまたはルートcontent
とコントローラーのプロパティに頭を悩ませようとしています。ルートでプロパティを設定すると、生成されたコントローラーmodel
のプロパティに自動的に設定されますか。content
また、content
コントローラーのプロパティを使用すると、テンプレート内のそのオブジェクトの属性にアクセスできると思いますが、それは本当ですか?
私はドキュメントを読みましたが、これらの規則のいくつかを消化するのにまだ苦労しています。
model
プロパティまたはルートcontent
とコントローラーのプロパティに頭を悩ませようとしています。ルートでプロパティを設定すると、生成されたコントローラーmodel
のプロパティに自動的に設定されますか。content
また、content
コントローラーのプロパティを使用すると、テンプレート内のそのオブジェクトの属性にアクセスできると思いますが、それは本当ですか?
私はドキュメントを読みましたが、これらの規則のいくつかを消化するのにまだ苦労しています。
ここで回答したように、オブジェクトまたはオブジェクトのコレクションをそのルートのモデルとして設定できる機能がありますEmber.Route
。model
単一のオブジェクトを処理するルートには拡張するEmber.ObjectController
コントローラーが必要ですが、オブジェクトのコレクションを処理するルートには拡張するコントローラーが必要Ember.ArrayController
です。その後、Route
ワークフローで、フックからのデータがmodel
フックを介してコントローラーのcontent
プロパティに設定されsetupController
ます。
ルートにはコントローラーをセットアップするための独自のワークフローがあるため、デフォルトでこのメソッドが呼び出され、コンテンツにモデルが入力されます。次の点を考慮してください。
App.Email = DS.Model.extend({
address: DS.attr('string'),
isActive: DS.attr('boolean')
});
App.Router.map(function() {
this.resource('emails', function() {
this.route('email', {path: ':email_id'});
});
});
App.EmailsRoute = Ember.Route.extend({
model: function() {
return App.Email.find();
}
});
App.EmailRoute = Ember.Route.extend({
model: function(params) {
return App.Email.find(params.email_id);
}
});
App.EmailsController = Ember.ArrayController.extend();
App.EmailController = Ember.ObjectController.extend();
フレームワークは、コントローラーをセットアップするために、これらのルートのデフォルト コードを生成する必要があります。これは次のようになります (必要に応じてオーバーライドできます)。
App.EmailsRoute = Ember.Route.extend({
...
setupController: function(controller, model) {
controller.set('content', model);
}
...
});
デフォルトの機能とは異なることを行うために、これらのメソッドをオーバーライドする必要がある/したい場合があります (上記の質問/回答を参照)。たとえば、次のようになります。
App.EmailsRoute = Ember.Route.extend({
model: function(params) {
return [{id: 1, address: 'other@email.com'}];
},
setupController: function(controller, model) {
// here, controller is whatever controller this route needs
// by conventions, it knows it should be EmailsController
// of the type ArrayController
// model is whatever was returned by the model function above
// the content is a "bag" which can be filled with a model or any
// other object you need. Just keep in mind your view layer will
// be referring to this object later on
controller.set('content', model);
// you can set other properties of the controller here too
controller.set('applyFilter', true);
}
});
これで、テンプレートはコントローラー内のデータにアクセスできるようになります。以下の例では、 内のオブジェクトのコレクション ( App.Email
)を反復処理しますEmailsController
。このコレクションまたはその子オブジェクトのパブリック属性は、ここからアクセスできます。1 つの例は{{email.address}}
次のとおりです。
<script type="text/x-handlebars" data-template-name="emails">
<ul>
{{#each email in controller}}
<li>
{{#linkTo emails.email email}}
{{email.address}}
{{/linkTo}}
</li>
{{/each}}
</ul>
{{outlet}}
</script>
テンプレートはモデルと直接対話しているのではなく、content
モデルからのデータが割り当てられた と対話していることに注意してください。私が言ったように、ルートを介してコンテンツまたはモデル内の任意のオブジェクトを隠すことができるため、使用に縛られDS.Model
たり、アーキテクチャが強く結合されたりすることはありません。
このモデルがタイプではなく、App.Email
異なる属性を持つ別のタイプを持っていた場合、ここでもアクセスできますが、制限があります。モデルの属性がコレクションの場合、インデックスを介してアクセスできません (たとえば{{email.messages[0].body}}
、機能しません)。この場合の最善の方法は、コントローラーの計算されたプロパティであり、メールのメッセージ コレクションの最初のアイテムがある場合は、そのアイテムに直接アクセスできます。