0

在我的 Backbone 应用程序中,我有一个显示帖子预览的主视图。当用户点击帖子时,帖子会在叠加层中展开,并且 URL 会更改以反映该帖子。当帖子展开时,用户可能会做一些事情来触发需要在根上下文中发生的对服务器的调用。问题是当帖子展开时,需要在根上下文发生的服务器调用发生在帖子上下文中。以下是操作顺序:

  1. 页面加载了主视图 url:http://localhost:8080/my-web-app/
  2. 用户点击post,显示overlay,url更新为:http://localhost:8080/my-web-app/posts/1
  3. 用户单击触发对服务器的调用的内容。网址为:http://localhost:8080/my-web-app/posts/1/load,这是错误的。

在上面的示例中,加载操作需要从根上下文发生:http://localhost:8080/my-web-app/load

我尝试更改我的模型、集合等的 url 属性以包含前导 /,但这会删除“/my-web-app/”上下文(url 变为http://localhost:8080/load) ,这在我的测试环境中是必需的。当然,这在生产环境中可以正常工作。

为了解决这个问题,我将 Backbone.history 根选项设置为“/my-web-app/”,并将每个 url 属性覆盖如下:

url: function() {
  (Backbone.history.options.root != undefined ? Backbone.history.options.root : "") + "load";
}

虽然这种方法有效,但是像这样覆盖每个 url 函数是一件很痛苦的事情……更不用说,它感觉很hacky。对于生产环境,它也是完全不必要的代码。有没有更优雅的方法来管理它,以便它在测试和生产环境中都可以工作?

谢谢!

4

2 回答 2

1

应用程序路由不应在开发环境和生产环境中有所不同。这总会在某个时候带来麻烦。

假设您在 localhost 上使用 Apache 服务器,您可以选择一个虚拟主机并/my-web-app//.

首先,在 /etc/hosts 文件中添加一个域名并将其指向 127.0.0.1,如下所示:

127.0.0.1   mywebapphost

然后将虚拟主机添加到您的 Apachevhosts.conf

<VirtualHost *:80>
    DocumentRoot "/Users/someone/Sites/my-web-app/" # absolute directory of your webapp
    ServerName mywebapphost
</VirtualHost>

你完成了!您的 webapp 在 //mywebapphost:8080 上可用,并且所有路由都与您的生产环境相同。

于 2012-06-28T22:00:10.323 回答
0

我遇到了这个问题,经过一段时间的强调后,我意识到您可以使用 * 作为路由的前缀来消除 Web 上下文的问题:

*posts/1/load

唯一的缺点是路由解析需要做更多的工作,但考虑到它是客户端,它应该可以忽略不计。

虽然您的路线在 dev、qa 生产之间可能不应该有所不同,但我认为可以公平地说许多 Web 应用程序被编写为与上下文无关,因此客户端的东西应该效仿恕我直言。

于 2012-07-12T21:30:23.433 回答