0

現在、バックボーンを使用してアプリケーションを作成していますが、何らかの理由でビューを更新しませんが、特定の状況でのみ更新されます。

index.html#/blog/2 でページを更新すると、ページが正常に読み込まれ、すべてがうまく機能します。ただし、index.html#/blog/1 のページを更新してから、URL を index.html#/blog/2 に変更して Enter キーを押しても (更新ではありません)、変更が反映されることはありません。

これは私のルーターです:

makeChange: function() {

    // Set activePage to the current page_id => /blog/2
    var attributes = {activePage: this.page_id};
    var $this = this;

    // Loop through all sections in the app
    app.sections.some( function( section ) {

        // Check if section has the page
        if( !section.validate( attributes ) )
        {

            // If it has, set the activePage to /blog/2
            section.set( attributes, {silent: true} );
            // Set active section to whatever section-id was matched
            app.set( {activeSect: section.id}, {silent: true} );

            console.log('Calling change!');

            // Calling change on both the app and the section
            app.change();
            section.change();

            console.log('Change complete!');

            return true;

        }

    });

}

これはアプリ ビューです (上記の「アプリ」として参照されています^)。

var AppView = Backbone.View.extend({

    initialize: function( option ) {

        app.bind( 'change', _.bind( this.changeSect, this ) );

    },

    changeSect: function() {

        var newSect = app.sections.get( app.get('activeSect' ) );
        var newSectView = newSect.view;

        if( !app.hasChanged( 'activeSect' ) )
            newSectView.activate( null, newSect );

        else
        {

            var oldSect = app.sections.get( app.previous( 'activeSect' ) );
            var oldSectView = oldSect.view;

            newSectView.activate( oldSect, newSect );
            oldSectView.deactivate( oldSect, newSect );

        }

    }

});

他のクラス/モデル/ビューを見る必要があるかどうか教えてください。

4

1 に答える 1

1

解決しました!これは、同じセクション内の (セクション内の activePage を変更することによって) 異なるページ間を移動する場合にのみ発生するため、アプリ内の activeSect は変更されず、changeSect() が呼び出されることはありません。これで、アプリ内の activeSect が同じで、セクション内の activePage が変更された場合でも、アプリ内で changeSect() が呼び出されます。

セクションモデルでは、これを追加しました:

initialize: function() {

    this.pages = new Pages();
    this.bind( 'change', _.bind( this.bindChange, this ) );

},

prepareForceChange: function() {

    this.forceChange = true;

},

bindChange: function() {

    console.log('BINDCHANGE!');
    if( this.forceChange )
    {

        AppView.prototype.forceChange();
        this.forceChange = false;

    }

},

この上の router.makeChange() では:

section.set( attributes, {silent: true} );
app.set( {activeSect: section.id}, {silent: true} );

追加した:

var oldSectId = app.get('activeSect');
if( oldSectId == section.id ) section.prepareForceChange();
于 2012-08-28T22:40:31.033 に答える