【问题标题】:Marionette.js appRouter not firing on app startMarionette.js appRouter 未在应用启动时触发
【发布时间】:2013-03-06 23:50:17
【问题描述】:

我目前正在将 Marionette 集成到现有的 Backbone 应用程序中。

我有一个现有的 Backbone 路由器,但我正在尝试实现一个 Marionette.AppRouter 来代替它。问题是,在新 Marionette 路由器应该获取的 URL 上的“硬刷新”上,它不会触发。如果我导航到另一个页面,然后返回到硬刷新时未触发的 url,它会正确触发。我无法弄清楚为什么它在之后我已经导航到另一个页面并再次返回。这是我的代码示例:

TestApp = new Backbone.Marionette.Application();
    var testAppController = {
        testLoadPage: function(){
            console.log('testLoadPage Fired'); //<---- DOES NOT FIRE ON HARD REFRESH
        }
    };
    TestAppRouter = Backbone.Marionette.AppRouter.extend({          
        appRoutes: {
            "!/:var/page": "testLoadPage",
            "!/:var/page/*path": "testLoadPage"
        },
        controller: testAppController,
        route: function(route, name, callback) {
            return Backbone.Router.prototype.route.call(this, route, name, function() {
                if (!callback) callback = this[name];
                this.preRoute();
                this.trigger.apply(this, ['beforeroute:' + name].concat(_.toArray(arguments)));
                callback.apply(this, arguments);
            });
        },
        preRoute: function() {
            app.showLoader(name, arguments);
        }
    });
    TestApp.addRegions({
        contentContainer: '#container'
    });
    TestApp.addInitializer(function(options){
        new TestAppRouter();
    });
    TestApp.start();

当我直接加载页面:http://mysamplesite.com/#!/123/page 时,Marionette 路由器不会按应有的方式触发。

但是,如果我加载页面:http://mysamplesite.com/#!/123,然后导航到http://mysamplesite.com/#!/123/page,Marionette 路由器将正确触发。有什么想法吗?

【问题讨论】:

    标签: backbone.js marionette


    【解决方案1】:

    您在创建路由器实例后是否致电Backbone.history.start()?如果没有,您需要这样做。在你的应用程序中调用它之前,路由器不会运行,并且在至少一个路由被实例化之前你不能调用它。我通常这样做:

    
    TestApp.on("initialize:after", function(){
      if (Backbone.history){ Backbone.history.start(); }
    });
    

    【讨论】:

    • 是的,我确实接到了Backbone.history.start 的电话。我曾尝试在示例代码块的开头调用它,在示例代码块之后,我只是在示例代码块的末尾尝试了您的方法,但无济于事。 console.log('testLoadPage'); 仍然没有触发。感谢您的回复,但问题仍然存在。
    • 我还注意到您的响应中的修复永远不会触发。我添加了代码:TestApp.on("initialize:after", function(){ if (Backbone.history){ console.log('startingHistoryAgain') Backbone.history.start(); } else ( console.log('not started again') ) });,并且 if 或 else 都没有被触发。 @Derick Bailey
    • 确保在调用TestApp.start();之前绑定了“initialize:after”事件
    • 非常感谢。我的问题已经解决了。我现在可以在我的应用程序中继续使用 Marionette。 @Derick Bailey
    猜你喜欢
    • 1970-01-01
    • 2016-12-08
    • 2021-08-10
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 2018-05-27
    • 2017-04-14
    • 1970-01-01
    相关资源
    最近更新 更多