【问题标题】:How could I use Router in View module in modular Backbone.js app?如何在模块化 Backbone.js 应用程序的视图模块中使用路由器?
【发布时间】:2012-04-28 10:00:13
【问题描述】:

我使用RequireJS来组织我的Backbone应用,我的Router模块如下:

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 模块中的路由。 我的视图模块的开始部分如下:

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。那么我该如何实现呢?

【问题讨论】:

    标签: backbone.js requirejs backbone-routing


    【解决方案1】:

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

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

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

    IE,

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

    【讨论】:

    • 我对 app.js 的内容有点困惑。你能写更多关于它的内容吗?谢谢!
    • app.js 将是您实际的主干应用程序开始的地方(如上面的“开始”功能)。只是基本的应用程序逻辑。它不会返回任何内容,也不会包含在任何其他模块中,它只是应用程序开始的地方。
    • 你的意思是将start函数从route模块移动到app模块?之后,我应该把在app模块中创建的路由器实例,在我的例子中是变量approuter,放在share.js中的YourObject{}中,然后我可以在其他任何地方使用shared.js。我说的对吗?
    • 谢谢这个帮了我很多的家伙!
    【解决方案2】:

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

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

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

    【讨论】:

    • 正如你所说,他们应该做的就是提供链接,这会触发路由器的路由。那就是问题所在。我想将路由器的路由与其他一些操作相关联,而不是单击链接。所以我不想在这里使用链接,我必须使用Router.navigate()function 来触发路由器的路由。由于其他一些操作肯定会在 View 模块中触发。所以,根据我的知识,我必须在我的视图模块中使用Router.navigate()。或者也许还有其他方法可以解决这个问题。或者我对 RequireJS 和/或 Backbone 有误解。
    • 然后你要做的是触发触发路由的事件!
    • 路由器监听 location.href 和 location.hash 的变化对吧?所以改变位置应该有效。就我个人而言,我使用window.location.replace('#login') 将视图重定向到注销页面
    • 顺便说一句,我还在更改我使用backbone.js 和jqm 制作的应用程序以使用require.js。我使用了一个在视图中使用的全局 app 变量,我可能需要更改它。
    【解决方案3】:

    如何使用

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多