1

以下は私のバックボーンビューです。

define([
    'app',
    'backbone',
    'twig',
    'templates/report',
    'data/reportViewCollection',
    'data/reportViewModel'
], function (app, Backbone, Twig, template, Collection, Model) {

    var collection = new Collection();
    var fetching;

    return Backbone.View.extend({
        setParams: function (rlId, viewId, categoryId, depth) {
            // reset any possible pending previous repests.
            fetching = false;

            var model = collection.getModel(rlId, viewId, categoryId, depth);
            if (!model) {
                model = new Model({
                    rlId: rlId,
                    viewId: viewId,
                    categoryId: categoryId,
                    depth: depth
                });
                fetching = model.fetch({
                    success: function (model) {
                        collection.add(model);
                    },
                    error: function (model) {
                        alert('error getting report view');
                    }
                });
            }
            this.model = model;
        },
        render: function () {
            var that = this;
            var done = function() {
                app.vent.trigger('domchange:title', that.model.get('title'));
                that.$el.html(Twig.render(template, that.model.toJSON()));

                that.delegateEvents(that.events);
                fetching = false;
            };
            if (fetching) {
                app.loading(this);
                fetching.done(done);
            } else {
                done();
            }
            return this;
        },
        events: {
            'change select.view-select': 'viewSelect',
            'click #dothing': function (e) {e.preventDefault(); alert('hi');}
        },
        viewSelect: function(e) {
            var selectedView = $(e.target).val();
            var rlId = this.model.get('rlId');
            if (!rlId) rlId = 0;
            var url = 'report/' + rlId + '/' + selectedView;
            console.log(this, e, url);
            Backbone.history.navigate(url, {trigger: true});
        }
    });
});

機能の説明:

特定のURLに移動するとsetParams()、サーバーからモデルをフェッチするために関数が呼び出されます。renderメソッドが呼び出されると、現在モデルをフェッチしているかどうかをチェックし、フェッチしている場合は、フェッチが完了したときにテンプレートをレンダリングするために遅延コールバックを設定します。モデルがフェッチされ、レンダリングの準備ができたら、テンプレートをレンダリングし、ビューに。で入力しthat.$el.html()ます。

問題:

何が起こるかというと、最初にURLに移動したときにイベントは完全に機能しますが、戻るボタンを押してもイベントは添付されません。

コードをステップスルーしましたが、違いはわかりません。唯一の本当の違いは、モデルcollectionをフェッチするためにajaxリクエストを実行するのではなく、キャッシュされたモデルからモデルをロードしていることです。

何が起こっているのか手がかりはありますか?

4

2 に答える 2

0

変更してみてください:

that.$el.html(Twig.render(template, that.model.toJSON()));

that.$el.html("");
that.$el.append(Twig.render(template, that.model.toJSON()));

同じ問題があり、これで修正されました。

于 2012-08-20T21:27:37.877 に答える
0

問題を解決しました。@mu のコメントは、私を正しい方向に導きました。

私はMarionetteを使用しており、私のビューはリージョンに含まれています。Region の open 関数ではthis.$el.html(view.el);、特定の状況でイベントを消去することを行っています。なぜそれが一部で行われるのか、他のものでは行われるのかはまだわかりません。

onShow解決策は、呼び出しのビューに関数を追加することであることが証明されましたthis.delegateEvents()。現在、すべてがスムーズに機能しています!

私は最終的に、コードをステップ実行し、ビューの div に登録されたイベントを見て、それを理解しました。

于 2012-08-21T12:31:14.017 に答える