我是Backbone的新手,所以作为一个学习练习,我正在尝试使用Rails后端设置一个简单的应用程序。我正在努力分离Rails api路由和Backbone路由。 例如,我的Backbone路由器目前看起来像这样:
class App.Routers.LawAppRouter extends Backbone.Router
routes:
'': 'index'
'flows/:id': 'showFlow'
index: ->
flows = new App.Collections.Flows()
flows.fetch().done =>
view = new App.Views.Flows(collection: flows)
$('#container').html(view.render().el)
showFlow: (id) ->
alert('in showFlow)
我想要做的是将Rails API置于“api / v1 / resource”命名空间下,而Backbone将处理简单的“/ resource”路由,然后在处理函数中调用API。
最初我创建了一个Flow模型
class App.Models.Flow extends Backbone.Model
集合
class App.Collections.Flows extends Backbone.Collection
url: 'api/v1/flows'
model: App.Models.Flow
和索引视图
<ul>
<% for flow in @flows.models: %>
<li>
<a href="<%= flow.url() %>"><%= flow.get('title') %></a>
</li>
<% end %>
</ul>
以这种方式编写,flow.url()返回
api/v1/flows/:id
直接命中API。相反,我希望flow.url()生成客户端路由
flows/:id
所以我将模型改为
class App.Models.Flow extends Backbone.Model
clientSideUrl: ->
"flows/#{@id}"
索引视图
<a href="<%= flow.clientSideUrl() %>"><%= flow.get('title') %></a>
现在生成
flows/:id
据我所知,应与此Backbone路由匹配
'flows/:id': 'showFlow'
然而,它继续在/ flow /:id处访问API,因为Rails中不存在该路由,所以会抛出错误。
谢谢!
答案 0 :(得分:0)
如果你没有使用pushState,那么href属性中的url应该是:
<a href="<%= #/flow.clientSideUrl() %>"><%= flow.get('title') %></a>
由于#缺少它直接尝试导航到url而不是实例化路由器。
如果您使用的是html pushState,那么您需要遵循以下内容: https://stackoverflow.com/a/9331734/741108
如果您希望您的模型/集合和路由器网址看起来类似,那么您可以使用$ .ajaxPrefilter
// root = 'http://your.domain.com/api/v1'
$.ajaxPrefilter(function(options,orginalOptions,jqXHR){
options.url = root + options.url;
});
现在,每次ajax调用都会在实际调用之前通过预过滤器。
因此,模型(urlRoot)和集合(url)可以在其定义中具有相对url,它们看起来类似于Routes url,但是,当进行服务器调用时,完整的url在预过滤器中被框起来。