我正在开发我的第一个 RequireJS/Backbone 应用程序,但我碰壁了。这里有很多代码气味,我知道我只是缺少模式。
我有一条显示所有促销的路线,还有一条显示特定促销的路线(按 ID):
showPromotions: function () {
var promotionsView = new PromotionsView();
},
editPromotion: function (promotionId) {
vent.trigger('promotion:show', promotionId);
}
在我的促销视图初始化程序中,我更新了我的 PromotionsCollection & fetch。我还订阅了集合上的重置事件。这调用 addAll 最终构建所有 Promotions 的 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”类型的调用,但我更喜欢不需要执行这种检查的设计。我的问题:
- 无论我走哪条路线,我如何确保我的收藏被填充?
- 我在我的
addAll
方法中调用 render 来拉入我的模板。我当然可以将该代码移入addAll
,但总体而言,该代码也有异味。我是否应该有一个负责呈现模板本身并根据需要实例化我的列表/编辑视图的“父视图”?
谢谢!