我正试图围绕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动作从未被调用时。如果我刷新它的名字,那么路线就匹配了。
我错过了什么?
答案 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部分系列,第二部分专注于主干的渐进增强,以满足您的需求:
和
希望有所帮助:)