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

Nic*_* A. 10 backbone.js

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

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

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

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

我错过了什么?

nra*_*itz 18

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

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

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

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

  • 顶级视图更改时需要更改的UI的任何部分都绑定了更新方法change:topview.当事件触发时,它们会state.get('topview')根据需要查看并更新.

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

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

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


Der*_*ley 7

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

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

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

这告诉Backbone使用HTML5历史API(又名"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/

希望有帮助:)