私は最初の RequireJS/Backbone アプリに取り組んでいますが、壁にぶつかりました。ここにはコードの匂いがたくさんありますが、パターンを見逃していることはわかっています。
すべてのプロモーションを表示するルートと、特定のプロモーション (ID による) を表示するルートがあります。
showPromotions: function () {
var promotionsView = new PromotionsView();
},
editPromotion: function (promotionId) {
vent.trigger('promotion:show', promotionId);
}
プロモーション ビューのイニシャライザで、PromotionsCollection を新しく作成してフェッチします。コレクションのリセット イベントもサブスクライブします。これは addAll を呼び出し、最終的にすべてのプロモーションの ul を構築し、それを DOM のコンテナー div に追加します。
define([
'jquery',
'underscore',
'backbone',
'app/vent',
'models/promotion/PromotionModel',
'views/promotions/Promotion',
'collections/promotions/PromotionsCollection',
'text!templates/promotions/promotionsListTemplate.html',
'views/promotions/Edit'
], function ($, _, Backbone, vent, PromotionModel, PromotionView, PromotionsCollection, promotionsListTemplate, PromotionEditView) {
var Promotions = Backbone.View.extend({
//el: ".main",
tagName: 'ul',
initialize: function () {
this.collection = new PromotionsCollection();
this.collection.on('reset', this.addAll, this);
this.collection.fetch();
},
render: function () {
$("#page").html(promotionsListTemplate);
return this;
},
addAll: function () {
//$("#page").html(promotionsListTemplate);
this.$el.empty().append('<li class="hide hero-unit NoCampaignsFound"><p>No campaigns found</p></li>');
this.collection.each(this.addOne, this);
this.render();
$("div.promotionsList").append(this.$el);
},
addOne: function (promotion) {
var promotionView = new PromotionView({ model: promotion });
this.$el.append(promotionView.render().el);
}
});
return Promotions;
});
リスト内の各プロモーションには、href の編集ボタンがあります#promotion/edit/{id}
。最初にリスト ページに移動して [編集] をクリックすると、問題なく動作します。ただし、編集ページに直接移動できません。これは、ビューの初期化メソッドでコレクションを作成しているためだと理解しています。「if collection.length == 0, fetch」タイプの呼び出しを行うこともできますが、この種のチェックを実行する必要のない設計を好みます。私の質問:
- どのルートを使用したかに関係なく、コレクションにデータが入力されていることを確認するにはどうすればよいですか?
- メソッド内で render を呼び出して
addAll
、テンプレートを取り込みます。確かにそのコードを に移動できましたaddAll
が、全体的にこのコードも臭いです。テンプレート自体のレンダリングを担当し、必要に応じてリスト/編集ビューをインスタンス化する「親ビュー」が必要ですか?
ありがとう!