Backbonejs:在视图中渲染的模型,但在集合中不存在
Backbonejs: model rendered in view but dont exist in collection
我只是不知道是什么导致了问题,需要帮助。在发布之前,我已经提出了另一种解决方案,但我想了解为什么这不能正常工作。
我有一个初始化视图的路由器,它初始化实体集合和视图,如下所示:
advertiser_manage_campaign: function () {
this.campaignListView = new window.CampaignListView;
this.mainSidebar = new window.MainSidebar;
},
活动列表视图:
window.CampaignListView = Backbone.View.extend({
el: ("#right_column"),
initialize: function () {
this.render();
this.campaignCollection = new Campaign.CampaignCollection;
this.campaignCollectionView = new Campaign.CampaignCollectionView({ model: this.campaignCollection });
this.campaignCollection.fetch();
},
events: {
"click .campaign_dialog": "openCampaignDialog"
},
openCampaignDialog: function (e) {
var that = this;
var itemID = $(e.target).attr("item-id");
var model = {}; //model to populate dialog inputs
if (!isNaN(itemID))
model = this.campaignCollection.get(itemID).toJSON(); //get existing model from collection <- after described procedure, error
Campaign.Dialog.open(model, function (data) {
if (isNaN(itemID)) {//model does not exist, create
that.campaignCollection.create(data, { wait: true,
error: function (model, error) {
dialoger.showErrors(JSON.parse(error.responseText).errors);
},
success: function (mdl, response) { window.Campaign.Dialog.close(); }
});
} else {//model exist, update
model = that.campaignCollection.get(itemID);
model.save(data, { wait: true,
error: function (mdl, error) {
dialoger.showErrors(JSON.parse(error.responseText).errors);
},
success: function (mdl, response) { window.Campaign.Dialog.close(); }
});
}
});
return false;
},
render: function () {
$(this.el).html(window.Templates.getHTML("campaign_list_view", {}));
$(".button", $(this.el)).button();
}
});
-
openCampaignDialog
用于编辑模型和创建新模型。模型的每个视图(表行)有一个类为".ccampaign_dialog"的按钮,还有一个添加同类新模型的按钮。
Campaign.Dialog.open
显示用模型填充的对话框,并在回调中从对话框窗体返回JSON。
如果我通过对话框创建新模型,我可以立即编辑它,但当我创建新模型时,更改视图,返回到此视图,再次创建新模型、更改视图,然后再次返回,在最后添加的项目上单击编辑,我在评论行上收到错误,因为具有此ID的模型不在集合中,尽管它在集合中。服务器的响应是可以的。显然,我做错了什么,一天后,我不知道是什么。
我提出的另一个解决方案是从模型视图的事件创建和填充对话框(这很有效),但我认为CampaingCollectionView或CampaingView不应该处理添加或编辑模型的问题,所以我在"更高"视图中实现了这一点。
感谢大家帮助我…
编辑:
var CampaignCollectionView = Backbone.View.extend({
el: (".content_table tbody"),
initialize: function () {
this.model.bind("reset", this.render, this);
this.model.bind("add", this.add, this);
},
render: function () {
$(this.el).empty();
_.each(this.model.models, function (campaign) {
$(this.el).append(new CampaignView({ model: campaign }).render().el);
}, this);
return this;
},
add: function (model) {
window.Appender.AppendAndScroll($(new CampaignView({ model: model }).render().el), this.el);
}
});
我找到了解决方案。
然而,当我们通过以下方式将对象绑定在一起时,就会出现问题事件,但我们并不麻烦解除它们的绑定。只要这些物体绑定在一起,并且在我们的应用程序代码中引用了at至少有一个,它们不会被清理或垃圾收集。这个由此产生的内存泄漏就像电影中的僵尸一样&隐藏在黑暗的角落,等着跳出来吃午饭。
来源:http://lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions-in-backbone-apps/
作者提出了解除绑定机制,但若存在,我将重用相同的对象。
路由器:
advertiser_manage_campaign: function () {
if (!this.campaignListView)
this.campaignListView = new window.CampaignListView;
else
this.campaignListView.initialize();
this.mainSidebar = new window.MainSidebar;
},
若有人认为这不是最好的解决方案,我想听听原因。
感谢所有试图提供帮助的人!
- 正在将事件处理程序添加到不存在的类
- javascript如果图像不存在don't加载它
- 由于响应中不存在“Access Control Allow Origin”标头,跨域请求停止工作
- JavaScript-如果以前不存在文本,如何从文本区域删除新行
- 如何将一个函数附加到一个不存在的元素上
- 在scala或scalajs Diode中,现有类型中的任何一种都符合“;更新一个没有'还不存在”;
- 查找数组's按属性不存在于另一个数组中的对象
- 用javascript在对象上创建不存在的方法
- 仅当值不为'不存在
- casperjs-css选择器存在,但当单击它时会引发“”;CasperError:无法在不存在的选择器“”上调度mou
- 运行时不存在Javascript函数
- 主干.js集合不迭代
- 使用webdriver和selenium验证元素是否不存在
- 如果文件不存在,fs.watch是否有错误处理程序
- 试图把注意力集中在一个不重要的元素上是不是一种糟糕的做法;不存在
- Backbonejs:在视图中渲染的模型,但在集合中不存在
- 从params推送到对象(如果不存在)
- 当锚点HREF源不存在时隐藏图像
- MongoDB 的集合构造函数是否仅在集合不存在时才创建集合
- 给定一个id列表,查询集合中不存在哪些id的最佳方法是什么?