Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js/Marionette.js中的路由-无哈希标签、路由列表和子路由器_Backbone.js_Routes_Marionette - Fatal编程技术网

Backbone.js/Marionette.js中的路由-无哈希标签、路由列表和子路由器

Backbone.js/Marionette.js中的路由-无哈希标签、路由列表和子路由器,backbone.js,routes,marionette,Backbone.js,Routes,Marionette,关于Backbone.js/Marionette.js中的路由,我有三个问题: 1) 如何获取应用程序的路由器已注册的所有路由的列表 例如,对于Express.js(在Node.js中),它将是app.routes 我正在尝试对Backbone.js/marionete.js执行相同的操作,但找不到任何执行此操作的属性或方法 2) 我想清理我的URL并删除它们前面的标签“#”,我知道它们会触发路由器,那么我如何才能做到这一点 我发现以下脚本是主干路由器的原型,但它更像是一个黑客而不是一个

关于Backbone.js/Marionette.js中的路由,我有三个问题:

  • 1) 如何获取应用程序的路由器已注册的所有路由的列表
例如,对于Express.js(在Node.js中),它将是
app.routes

我正在尝试对Backbone.js/marionete.js执行相同的操作,但找不到任何执行此操作的属性或方法

  • 2) 我想清理我的URL并删除它们前面的标签“#”,我知道它们会触发路由器,那么我如何才能做到这一点
我发现以下脚本是主干路由器的原型,但它更像是一个黑客而不是一个稳定的解决方案:

  • 3) 在Backbone.js/Marionette.js中是否可以有子路由器
我所说的子路由器是指只处理url一部分的路由器,例如:

var AppRouter = Backbone.Router.extend({
    routes: {
        'articles' : 'MyArticleRouter'
    }
});

var MyArticleRouter = Backbone.Router.extend({
    routes: {
        'science' : 'someMethod',
        'literrature' : 'someOtherMethod'
    }
});
通过让我在AppRouter中定义主路由,并在特定类别的子路由器中定义所有子路由(第二个斜杠“/”后的部分),这将对我的URL进行多一点分类

因此,对于以下URL:“主机名/文章/科学”,路由过程如下所示:

  • 1) 将“/文章/科学”传递给批准者
  • 2) AppRouter拆分URI并获取“/articles”部分
  • 3) AppRouter查找已注册的“/articles”路由
  • 4) AppRouter识别MyArticleRouter绑定到该URI元素
  • 5) AppRouter将路由转发到该路由器,并仅将“/science”元素作为路由传递
  • 6) MyArticleRouter将“/science”路由到someMethod()并运行它
提前谢谢你

回答#1:

所有路由都在主干.history.handlers中注册

#2的答案:

您可以向站点中的每个链接添加处理程序:

var application = new Backbone.Marionette.Application();

application.addInitializer(function(options) {
    // Add class to target a browser, not as standalone app.
    if(window.navigator.standalone != true) {
        $('body').addClass('no-standalone');
    }

    // Prevent internal links from causing a page refresh.
    $(document).on('click', 'a', function(event) {
        var fragment = Backbone.history.getFragment($(this).attr('href'));
        var matched = _.any(Backbone.history.handlers, function(handler) {
            return handler.route.test(fragment);
        });
        if (matched) {
            event.preventDefault();
            Backbone.history.navigate(fragment, { trigger: true });
        }
    });
});
当然,请确保使用pushState:

    if (!Backbone.history.started) {
        Backbone.history.start({ pushState: true });
    }
最后一个代码段必须在初始化所有路由器后运行

对#3的回答:

这可能会有助于拆分您的路线:

define([
    'backbone',
    'underscore',
    'routers/dashboard',
    'routers/anotherroute1',
    'routers/anotherroute2'
],

function(Backbone, _, DashboardRouter, AnotherRoute1, AnotherRoute2) {
    'use strict';

    var application = new Backbone.Marionette.Application();

    application.addInitializer(function () {

        _.each([DashboardRouter, AnotherRoute1, AnotherRoute2], function(router) {
            new router();
        });

        if (!Backbone.history.started) {
            Backbone.history.start({ pushState: true });
        }
    });

    return application;
});

谢谢你的回答,我开始觉得没人能回答^^对于#3,我不使用子路由,但我在其中一个应用程序初始值设定项上创建了多个路由。更新了答案。