3

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

路由器.咖啡:

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')

查看.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()
4

3 回答 3

5

Router::navigate所做的就是打电话,所以我Backbone.history.navigate会使用它。这里是源

choice: (ev)->
    Backbone.history.navigate(...);
于 2013-05-06T16:01:51.660 回答
4

只需将您的路由器与您需要的其他全局变量一起存储在 Backbone 对象中。

在您的路由器初始化中执行以下操作:

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

然后像这样使用它:

define(["backbone"], function (Backbone) {
     Backbone.application.router.myaction();
});
于 2013-09-07T12:22:51.757 回答
2

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

  1. 在视图构造函数中传递路由器并用作局部变量@options.router
  2. 在两个模块之间建立循环依赖(检查这个答案https://stackoverflow.com/a/16314250/329226
  3. 从视图中触发自定义导航事件并在路由器内收听
于 2013-05-06T17:04:49.623 回答