Backbone和Requirejs。如何从任何地方访问我的骨干路由器

时间:2013-05-06 13:27:37

标签: object backbone.js requirejs global router

我正在使用requirejs开发我的第一个项目。我有一个路由器和一个视图,我想在单击一个项目时从视图中访问我的Router.navigate()方法。我使用CoffeeScript。如何让路由器全局化?

router.coffee:

define [
'jquery'
'backbone'
'application/views/mainView'
'application/models/app'
],($,Backbone,MainView,App)->
class Router extends Backbone.Router
  routes:
    'organisation': 'organisationScreen'
    '*actions': 'organisationScreen'

  constructor:() ->
    super @routes

  initialize:()->

    Backbone.history.start() #pushState: true
    console.log " The Route Initialized"

  organisationScreen:()->
    $('.slides').fadeOut() 
    $('.confBlock').removeClass('onshow')
    $('.organisationsBlock').addClass('onshow')

view.coffee

define [
'jquery'
'backbone'
'application/views/conferenceView'
],($,Backbone,ConferenceView)->

class OrganisationView extends Backbone.View

  #el: '#appcontainer'

  tagName : 'li'
  className : 'organisation'

  events:
    'click .org-item' : 'choice'


  template : _.template($('#Organisation-template').html())

  initialize : ()->
   ...


  render: ()-> 
   ...

  choice:(ev)->
    # Call Router.navigate()

3 个答案:

答案 0 :(得分:5)

所有Router::navigate都会调用Backbone.history.navigate,所以我会使用它。 Here is the source

choice: (ev)->
    Backbone.history.navigate(...);

答案 1 :(得分:4)

只需将路由器与Backbone对象中所需的其他全局变量一起存储即可。

在路由器init中

执行以下操作:

    Backbone.application = {};
    Backbone.application.router = this;

然后像这样使用它:

define(["backbone"], function (Backbone) {
     Backbone.application.router.myaction();
});

答案 2 :(得分:2)

我为您的问题看到了三个选项:

  1. 在视图构造函数中传递路由器并将其用作本地变量@options.router
  2. 在两个模块之间建立循环依赖关系(查看此答案https://stackoverflow.com/a/16314250/329226
  3. 从视图中触发自定义导航事件并从路由器中侦听