我有一个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)
答案 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'
#...