何が問題を引き起こしているのかわからず、助けが必要です。投稿する前に私は別の解決策を思いついたが、なぜこれが正しく機能していないのかを知りたい。
エンティティコレクションとビューを初期化するビューを初期化するルーターがあります。
advertiser_manage_campaign: function () {
this.campaignListView = new window.CampaignListView;
this.mainSidebar = new window.MainSidebar;
},
CampaignListView:
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
モデルの編集と新規作成の両方に使用できます。モデルのすべてのビュー(テーブル行)には、クラス「.campaign_dialog」のボタンがあり、同じクラスの新しいモデルを追加するためのボタンがあります。
Campaign.Dialog.open
モデルが入力されたダイアログを表示し、コールバックでダイアログフォームからJSONを返します。
ダイアログを介して新しいモデルを作成する場合、すぐに編集できますが、新しいモデルを作成するときは、ビューを変更してこのビューに戻り、新しいモデルを再度作成してビューを変更してから、最後に追加したアイテムで[編集]をクリックします。このIDのモデルはコレクションに含まれていませんが、コレクションに含まれていないため、コメント行でエラーが発生します。サーバーからの応答はOKです。明らかに、私は何か間違ったことをしていて、ある日の後、それが何であるかわかりません。
私が思いついた別の解決策は、モデルビューのイベントからダイアログを作成してデータを入力することです(これは機能します)が、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);
}
});