路线未处理

时间:2012-02-15 22:07:58

标签: node.js backbone.js coffeescript

我有一个node.js(服务器)和backbone.js(客户端)应用程序 - 我可以在页面上加载和初始化我的骨干应用程序...并初始化路由器,但我的默认路由(“。* “)没有被召集。我初始化路由器后可以手动调用索引函数,但是当我在rails上构建主干应用程序时,我不必采取这一步骤。

有没有人知道为什么会这样?

添加代码(在coffeescript中):

class NodeNetBackbone.Routers.RegistryPatients extends Backbone.Router
  routes:
    ''          : 'index'
    '.*'        : 'index'
    '/index'    : 'index'
    '/:id'      : 'show'
    '/new'      : 'new'
    '/:id/edit' : 'edit'

  initialize: ->
    console.log 'init the router'
    @registry_patients = new NodeNetBackbone.Collections.RegistryPatients()
    # TODO: Figure out why this isn't sticking...
    @registry_patients.model = NodeNetBackbone.Models.RegistryPatient
    # TODO: Try to only round trip once on initial load
    # @registry_patients.reset($('#container_data').attr('data'))
    @registry_patients.fetch()

    # TODO: SSI - why are the routes not getting processed?
    this.index()

  index: ->
    console.log 'made it to the route index'
    view = new NodeNetBackbone.Views.RegistryPatients.Index(collection: @registry_patients)
    # $('#container').html('<h1>Patients V3: (Backbone):</h1>')
    $('#container').html(view.render().el)

1 个答案:

答案 0 :(得分:0)

骨干路由不是正则表达式(除非您使用route手动添加正则表达式路由)。来自fine manual

  

路由可以包含参数部分:param,它们匹配斜杠之间的单个URL组件;和splat部分*splat,可以匹配任意数量的URL组件。

     

[...] "file/*path"的路线将与#file/nested/folder/file.txt匹配,并将"nested/folder/file.txt"传递给行动。

如果我们检查来源,we'll see this

// Backbone.Router
// -------------------
//...
// Cached regular expressions for matching named param parts and splatted
// parts of route strings.
var namedParam    = /:\w+/g;
var splatParam    = /\*\w+/g;

因此,您的'.*'路由应仅与文字'.*'匹配,而不是与您期望的匹配“任何内容”。

我想你想要更像这样的东西:

routes:
  ''          : 'index'
  #...
  '*path'     : 'index'

确保您的*path路线位于the bottom of your route list

// Bind all defined routes to `Backbone.history`. We have to reverse the
// order of the routes here to support behavior where the most general
// routes can be defined at the bottom of the route map.

这个关于对象中元素“顺序”的假设对我来说似乎很危险而且考虑不周there is no guaranteed order

  

未指定枚举属性的机制和顺序(第一个算法中的步骤6.a,第二个算法中的步骤7.a)。

我认为您最好在*path方法中手动添加默认initialize路线:

class NodeNetBackbone.Routers.RegistryPatients extends Backbone.Router
  routes:
    ''          : 'index'
    '/index'    : 'index'
    '/:id'      : 'show'
    '/new'      : 'new'
    '/:id/edit' : 'edit'

  initialize: ->
    console.log 'init the router'
    @route '*path', 'index'
    #...