在Backbone中的视图内部调用路由

bob*_*hox 6 router view backbone.js

我知道有很多关于使用Backbone.js进行orgaising应用程序的教程/信息.我在这些教程的帮助下逐渐创建了一个.我似乎无法理解路由器的概念.好吧,我知道路由器是起点(并告诉应用程序的状态),最好避免在那里放置更多逻辑.

我有一个路由器.我的应用程序首先会加载页面的页眉,页脚和主要部分.在主要部分,首先,我应该登录用户.要加载登录页面,我会这样做:

       var AppRouter = Backbone.Router.extend({
            initialize : function() {
            var headerView = new HeaderView({el:$('#header')});
            headerView.render;

            var footerView = new FooterView({el:$('#footer')});
            footerView.render;

            var loginView = new LoginView({el:$('#login')});
            loginView.render;
        },
        routes : {
            "inbox" : "inbox",
            "sentbox : "sentbox"
        },
        inbox : function() {
            // ...
        },
        sentbox : function() {
            // ...
        }
    });
    app = new AppRouter();
    Backbone.history.start();
Run Code Online (Sandbox Code Playgroud)

成功登录后,将加载邮件页面.MailView有一些事件要显示收件箱,例如sendbox.

     events: {
        "click .inbox": "showInbox",
        "click .sentbox": "showSentbox",
      },
       showInbox : function() {
            // app.route() or app.inbox() - ?
      }
Run Code Online (Sandbox Code Playgroud)

在这一点上,我希望路由器显示../#inbox../#sentbox分别.我想知道我是否应该在这里调用一个路由器的方法来显示在地址栏中.为什么我感到困惑是因为它说使用一个路由器比使用更好.如果我这样做,我AppRouter会更复杂.另一个问题是如果用户直接输入地址,我应该加载该页面.我认为它需要将逻辑放在AppRouter中.

请告诉我这里正确的方法.先谢谢!

Dan*_*art 12

查看Router.navigate()(http://documentcloud.github.com/backbone/#Router-navigate)

我通常在我的App对象中保存我的路由器的实例变量,例如

var App = {
  Views: {},
  Routers: {},
  Models: {},
  data: {}

  initialize: function() {
    this.data.mainRouter = new App.Routers.MainRouter();
  }
};
Run Code Online (Sandbox Code Playgroud)

其中App.MainRouter定义为:

App.Routers.MainRouter = Backbone.Router.extend({

   routes: {
     'route1' : 'route1handler',
     'route2/:param' : 'route2handler'
   },

   ... 
});
Run Code Online (Sandbox Code Playgroud)

然后在我看来,如果我想导航到新路线,我打电话:

App.data.mainRouter.navigate('route2/param1');
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您的路由器无法从您的视图中访问,您也可以调用`Backbone.history.navigate`. (7认同)
  • 要触发路由的处理程序,您必须添加`{trigger:true}`作为第二个参数. (4认同)
  • 这只会更改url哈希并且不会触发路由的处理程序方法 (3认同)

Joe*_*lls 7

您只需通过以下方式将浏览器发送到相应的路线:

location.href = "#/the_route_you_want";
Run Code Online (Sandbox Code Playgroud)

内部的监听器Backbone.history将捕获hashChange事件并显示正确的视图.

这可以通过HTML以非常简单的方式完成:

<a href="#/the_route_you_want">The Route You Want</a>
Run Code Online (Sandbox Code Playgroud)

进一步阅读.