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

时间:2012-04-28 10:00:13

标签: backbone.js requirejs 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
};
});

我还有另一个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){...

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

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:3)

这是一个有根据的猜测;)

您可能有一个循环要求。您需要视图模块中的路由器模块,并且还需要路由器模块中的视图模块。

这有点像糟糕的设计。您的路由器模块可能需要了解您的视图/模型,以便实例化它们并渲染它们。你的观点应该是无知的,有一个路由器可以创建它们。他们应该做的就是提供触发路由器路由的链接。

答案 2 :(得分:0)

使用

怎么样?

Backbone.history.navigate('' {触发:真});