使用backbone.js创建链接的首选方法

使用backbone.js创建链接的首选方法,backbone.js,Backbone.js,我试图对backbone.js了如指掌,但由于缺乏(IMO)好的示例,我发现这很难做到 首先,获取对象链接的最佳方式是什么。 如果我想获得相册模型的编辑url,我可以做Album.url()+'/edit',这真的是最好的方法吗 另外,我正试图让我的应用程序在没有javascript的情况下100%工作,所以我不希望我的URL/链接说/albums/#1/edit,我希望它是/albums/1/edit,并在JS中覆盖它 我想我会创建普通的URL,并使用jQuery.live调用路由器。在bac

我试图对backbone.js了如指掌,但由于缺乏(IMO)好的示例,我发现这很难做到

首先,获取对象链接的最佳方式是什么。
如果我想获得
相册
模型的编辑url,我可以做
Album.url()+'/edit'
,这真的是最好的方法吗

另外,我正试图让我的应用程序在没有javascript的情况下100%工作,所以我不希望我的URL/链接说
/albums/#1/edit
,我希望它是
/albums/1/edit
,并在JS中覆盖它

我想我会创建普通的URL,并使用
jQuery.live
调用
路由器。在backbone.js中导航

然而,当我调用
router.navigate('/albums/2',true)
URL会发生变化,但我的show操作从未被调用过。如果我刷新它,它会被调用,因此路径是匹配的


我遗漏了什么?

基本的答案是“没有更好的方法”,这有点令人沮丧。Backbone.js不会告诉您如何设置链接,您可以按自己喜欢的方式进行设置。我发现这种灵活性和你一样令人讨厌,至少一开始是这样

下面是我处理这件事的方法,有一个(大的)警告,这只是在主干网中做事情的许多方法之一:

  • 在大多数情况下,我不使用实际的链接。没有明确的理由不这样做,但这意味着您必须跟踪一组必须保持一致的URL字符串。我宁愿把所有的URL格式都放在我的路由器上,而不在别处处理

  • 为了打开一个新的“顶级”视图,比如编辑屏幕,我设置了触发事件的东西。在我目前正在处理的应用程序中,我有一个全局状态模型,要打开一个新视图,我调用
    State.set({topview:MyTopView})
    。这会导致
    状态
    对象触发
    更改:topview

  • 当顶层视图更改时,需要更改的UI的任何部分都有一个绑定到
    change:topview
    的更新方法。当事件触发时,他们查看
    状态。获取('topview')
    并根据需要进行更新

  • 我把我的路由器看作是UI的一部分,它们本质上是在浏览器地址栏中呈现的视图,而不是在窗口中呈现的视图。与其他视图一样,它们更新UI事件(即新URL)上的
    状态
    对象,并且与其他视图一样,它们侦听
    状态
    对象以查找导致更新的更改。编辑屏幕包含URL
    albums//edit
    的逻辑完全封装在路由器中,我不会在其他任何地方提及它

这对我来说很好,但它为主干结构添加了一种全新的模式,即全局状态对象,因此我很难称之为“首选”方法

更新:还要注意,
.url()
在主干习惯用法中指的是后端API中模型的url,而不是前端url(它不像Django的
获取绝对url
)。默认主干网设置中没有为您的模型提供面向用户的URL的方法-您必须自己编写

此外,我正在努力使我的应用程序在没有javascript的情况下100%工作;所以我不希望我的URL/链接说
/albums/#1/edit
,我希望它是
/albums/1/edit
,并在JS中覆盖它

您完全可以使用pushState来执行此操作。只需在Backbone.history.start调用中启用它:

Backbone.history.start({pushState:true})

这告诉主干网使用HTML5历史API(又称“PushState”),它使用完全符合您需要的URL

请在此处阅读历史api:

我写了一个关于使用pushstate的系列文章,共有两部分,第二部分重点介绍主干网的渐进增强,以满足您的需求:


希望有帮助:)

好帖子!知道为什么
navigate
不调用我的路由器吗?我必须看到更多的代码传递
true
导航应该调用与路由相关联的函数,这样要么你的路由没有被识别为与路由模式匹配,要么该函数没有达到你期望的效果……啊,导航url必须与路由完全匹配,这意味着我必须删除初始/I正在使用的
路由器。导航
现在,它工作正常,除非用户希望返回历史,然后主干调用控制器中以前的所有操作。提出了一个错误。谢谢你提供的信息!