我如何在模块化Backbone.js应用程序中使用View模块中的Router?

cha*_*oor 3 requirejs backbone.js backbone-routing

我使用RequireJS来组织我的Backbone应用程序,我的路由器模块如下:

define([
'jquery',
'underscore',
'backbone',
'collections/todos',
'views/todosview'
], function($, _, Backbone, TodosCollection, TodosView){
var AppRouter = Backbone.Router.extend({

    routes: {
        "": "index",
        "category/:name": "hashcategory"  
    },

    initialize: function(options){
        // Do something
    },

    index: function(){
        // Do something
    },

    hashcategory: function(name){
        // Do something
    }
});

var start = function(){ 
    p = $.ajax({
        url: 'data/todolist.json',
        dataType: 'json',
        data: {},
        success: function(data) {

            var approuter = new AppRouter({data: data});
            Backbone.history.start();
        }
    });     
};

return {
    start: start
};
});
Run Code Online (Sandbox Code Playgroud)

我有另一个app模块,用于Router.start()触发整个应用程序.现在,在我的Backbone.View模块中,我想Router.navigate用来触发这个Router模块中的路由.我的View模块的起始部分如下:

define([
'jquery',
'underscore',
'backbone',
'models/todo',
'views/todoview',
'text!templates/todo.html',
'router'
], function($, _, Backbone, TodoModel, TodoView, todoTemplate, Router){...
Run Code Online (Sandbox Code Playgroud)

但是当我想Router在这个模块中使用时,它总是说Router is not defined.我想要做的是Router.navigate在此View模块中触发某些操作时调用.那我该怎么做呢?

PSt*_*iou 8

创建一个单独的模块,该模块包含在您使用的每个其他模块中 - 它只是创建一个对象,您可以使用该对象来连接路由器实例,并从以后您希望的任何视图或模块中调用它.(除了存储数据等其他东西,并轻松传递给其他模块)

将此模块包含在此处首先粘贴的路由器模块中.从路由器模块底部删除启动功能.然后在该文件的末尾返回AppRouter.

在最终启动主干并创建路由器的应用程序模块中,您可以将路由器初始化保存到我所指的共享对象中.

IE浏览器,

shared.js - >没有deps,但是创建了YourObject = {}; 并返回YourObject router.js - >包含shared.js app.js - >包含shared.js和router.js.应用程序设置路由器并保存到YourObject.router然后启动主干.您现在可以从需要此shared.js模块的任何其他模块调用YourObject.router.navigate()