与backbone.js创建链接的首选方式

时间:2011-10-02 03:12:39

标签: backbone.js

我正试图围绕backbone.js,但由于缺乏(IMO)良好的例子,我发现它很难。

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

此外,我正在尝试让我的应用程序100%运行而不使用JavaScript,因此我不希望我的网址/链接说/albums/#1/edit,我希望它是/albums/1/edit并覆盖此JS。

我在考虑创建普通网址,并使用jQuery.live在backbone.js中调用router.navigate 我从来没有这个工作,但是,当我调用router.navigate('/albums/2', true) URL更改但我的show动作从未被调用时。如果我刷新它的名字,那么路线就匹配了。

我错过了什么?

2 个答案:

答案 0 :(得分:18)

基本的答案,令人沮丧,是“没有首选方式!”。 Backbone.js不会告诉您如何设置链接,您可以按照自己喜欢的方式进行操作。我发现这种灵活性和你一样烦人,至少在开始时是这样。

所以这就是我在my current project上接近这个问题的方式,并且(大)警告说这只是Backbone中做事的众多方法之一:

  • 在大多数情况下,我不使用实际链接。没有明确的理由不这样做,但这意味着你必须跟踪一堆必须一致的URL字符串。我宁愿在路由器中粘贴所有的URL格式,也不要在其他地方处理它。

  • 要打开一个新的“顶级”视图,就像编辑屏幕一样,我会设置触发事件的内容。在我目前正在开发的应用程序中,我有一个全局状态模型,并打开一个我称之为state.set({ topview: MyTopView })的新视图。这会导致state对象触发change:topview

  • 顶级视图更改时需要更改的任何UI都有一个绑定到change:topview的更新方法。当事件触发时,他们会查看state.get('topview')并根据需要进行更新。

  • 我将路由器视为UI的边缘专用部分 - 它们本质上是在浏览器地址栏中呈现的视图,而不是窗口。与其他视图一样,它们更新UI事件上的state对象(即新URL),并且像其他视图一样,它们会监听state对象以查找导致它们更新的更改。编辑屏幕具有URL albums/<albumid>/edit的逻辑完全封装在路由器中,我不会在其他任何地方引用它。

这对我很有用,但它为Backbone结构增加了一个全新的模式,全局State对象,所以我很难称之为“首选”方法。

更新:另请注意,Backbone习惯用法中的.url()是指后端API 中的模型URL,而不是前端URL(它不像Django的get_absolute_url)。默认的Backbone设置中没有方法为您的模型提供面向用户的URL - 您必须自己编写。

答案 1 :(得分:7)

  

此外,我正在尝试使我的应用程序100%没有javascript工作;所以我不希望我的网址/链接说/albums/#1/edit,我希望它是/albums/1/edit并在JS中覆盖它。

你可以用w / pushState完成这个。只需在Backbone.history.start调用中启用它:

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

这告诉Backbone使用HTML5历史记录API(a.k.a。“PushState”),它使用完全像您想要的完整URL。

在这里阅读历史api:http://diveintohtml5.ep.io/history.html

我编写了一个关于使用pushstate的2部分系列,第二部分专注于主干的渐进增强,以满足您的需求:

http://lostechies.com/derickbailey/2011/09/26/seo-and-accessibility-with-html5-pushstate-part-1-introducing-pushstate/

http://lostechies.com/derickbailey/2011/09/26/seo-and-accessibility-with-html5-pushstate-part-2-progressive-enhancement-with-backbone-js/

希望有所帮助:)