0

何が問題を引き起こしているのかわからず、助けが必要です。投稿する前に私は別の解決策を思いついたが、なぜこれが正しく機能していないのかを知りたい。

エンティティコレクションとビューを初期化するビューを初期化するルーターがあります。

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);
    }

});
4

1 に答える 1

0

私は解決策を見つけました。

ただし、これらのイベントを介してオブジェクトをバインドするときに問題が発生しますが、バインドを解除する必要はありません。これらのオブジェクトが一緒にバインドされており、アプリコードに少なくとも1つのオブジェクトへの参照がある限り、それらはクリーンアップされたり、ガベージコレクションされたりすることはありません。結果として生じるメモリリークは、映画のゾンビのようなものです。暗い隅に隠れて、飛び出して昼食のために私たちを食べるのを待っています。

ソース: 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;
},

誰かがこれが最善の解決策ではないと思うなら、私はその理由を聞きたいです。

助けてくれたすべての人に感謝します!

于 2012-08-23T09:21:34.180 に答える