3

我使用 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. 我想要做的是Router.navigate在这个 View 模块中触发某些操作时调用。那么我怎么能做到这一点呢?

4

3 回答 3

8

创建一个单独的模块,该模块包含在您使用的每个其他模块中——它将简单地创建一个对象,您可以使用它来附加路由器实例,并在以后从您希望的任何视图或模块中调用它。(除了存储数据和轻松传递给其他模块等其他事情)

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

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

IE,

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

于 2012-04-28T12:32:40.783 回答
3

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

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

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

于 2012-04-28T11:11:57.377 回答
0

怎么用

Backbone.history.navigate('',{trigger:true});

于 2014-04-25T04:48:07.200 回答