1


我一直在研究使我的应用程序成为单页应用程序的方法,并且当我在 StackOverFlow 中发布的另一个问题中被告知路由器方法是最新的 Ember 样式时,我正在考虑使用 StateManager。经过多次尝试,我偶然发现了路由器定义中的“位置:无”选项,并且使用该选项不再可以直接访问我的应用程序的屏幕。由于Router,我仍在使用路由,但是仅由于这一变化就假设我的应用程序确实成为单页Ember 应用程序是真的吗?或者我需要配置单页的哪些其他属性才能使其成为真正的单页 Ember 应用程序?

谢谢,
稻田

4

3 回答 3

1

让我们定义什么是单页应用程序 (SPA)。在 PHP 和 ASP.NET 统治互联网的日子里,Web 服务器会提供具有静态内容的静态页面。如果用户想要导航到不同的页面,那么他们将不得不向服务器请求完全不同的页面以获取不同的内容。

在 Javascript 和现代浏览器时代,我们不需要我们的网络服务器在每次我们想要查看新内容时发出不同的页面。内容是动态的,Javascript 允许我们在服务器不做任何事情的情况下替换页面的某些部分。这是 SPA 的关键,没有定义它的规则和代码。这是服务器最初提供给用户的单个页面,然后用户请求内容而不是不同的页面。

因此,如果您的应用程序仅提供单个页面,并且内容被注入或带走而无需从服务器请求另一个页面,那么您可以将其视为 SPA。在大多数使用这种设计的项目中,您会看到它们只有一个“index.html”页面,其他都是 javascript 文件和模板文件。这就是成为 SPA 的全部意义。

于 2013-05-08T15:49:17.010 回答
1

Sherwin Yu 和Deif 都是正确的。为了补充已经说明的内容, location 的默认实现(即HashLocation)将您的应用程序维护为 SPA 的原因是由于片段标识符的特定属性,这在本博文的第 4 节中得到了很好的总结。(具有讽刺意味的是,该帖子没有使用片段 ID,因此我无法将您直接链接到相关部分。)

看看这个 jsFiddle。您可能会注意到使用哈希实现的主要优点之一:

<a href="#/third">third template</a>

可书签链接直接指向您的应用程序中的特定路线,无需大惊小怪。

我认为这里可能发生的情况是:很多 SPA 框架没有提供像 Ember 的路由器位置这样的东西。有了它们,一旦您加载页面,网址就永远不会改变。因此,当 Ember 开始使用浏览器历史记录并且您看到 url 发生变化时,很自然会质疑您构建的这个东西是否仍然是 SPA。(起初它也让我失望!)请放心,它一个 SPA。如果它让您更舒适,请使用location: 'none'以保持单页美感;Ember 不会在意,但您的用户可能会。;)

于 2013-08-29T22:48:05.287 回答
1

简短的回答:这并不重要;使用路由器管理客户端状态将使任何 Ember 应用程序成为“单页应用程序”

几乎按照定义,使用路由器的 Ember.js 应用程序是“单页”——就像 Deif 所说的那样,“单页”基本上意味着对请求有一个初始请求(html + js + css),然后是 javascript Ember 应用程序初始化客户端,并在 Ember 应用程序中导航将导致不同的视图呈现/状态更改/显示数据(服务器返回要由客户端 EmberJS 应用程序显示的数据,而不是用 HTML 包装的内容),但它们都在同一个初始页面中。

这可能会与设置混淆location。默认情况下,Ember 将 a 附加/#到 URI,后跟路由路径。您会注意到,当您四处导航时(通过路由转换),后面的片段#会发生变化——但这仍然都在同一页面上,因此它算作“单页应用程序”。

那么当您单击“返回”按钮时会发生什么?当每个请求从服务器返回一个新的 HTML 页面时,很明显:单击“返回”通过重复 GET 请求将浏览器带到上一个页面。但是在 javascript 应用程序中呢?传统的 JS 单页应用程序可以“破坏”后退按钮——您可能会四处导航,更改客户端的状态,但点击后退按钮会将您返回到上一个网站,而不是您单页的上一个“页面”页面应用程序!

Ember 通过路由器 + 历史位置实现解决了后退按钮损坏的问题——设置location提供了不同的行为。认为 location:none完全禁用历史记录 - 我稍后会尝试。

请参阅:EmberJS 历史位置我的 Rails 路由应该如何与 pushState Ember.js 路由一起使用?EmberJS 路由指南

于 2013-05-09T03:07:08.760 回答