我一直在调查让我的应用程序成为单页应用程序的方法,当我在StackOverFlow中发布的另一个问题中告诉我路由器方法是最新的Ember风格时,我正在考虑使用StateManager。经过多次尝试,我偶然发现路由器定义中的“location:none”选项并使用该应用程序的屏幕不再可以直接访问。由于路由器,我仍在使用路由,但是假设我的应用程序确实已成为单页Ember应用程序,因为仅此一项更改是真的吗?或者我需要配置单页的其他哪些属性才能使其成为真正的单页Ember应用程序?
谢谢,
稻谷
答案 0 :(得分:1)
让我们来定义单页应用程序(SPA)是什么。在PHP和ASP.NET统治互联网的时代,Web服务器将会出现具有静态内容的静态页面。如果用户想要导航到不同的页面,那么他们必须要求服务器提供完全不同的页面才能获得不同的内容。
在Javascript和现代浏览器时代,每次我们想要查看新内容时,我们都不需要我们的网络服务器来制作不同的页面。内容是动态的,Javascript允许我们在服务器没有做任何事情的情况下替换页面的一部分。这是SPA的关键,没有规则和定义它的代码。它是服务器最初为用户提供的单个页面,然后用户请求内容而不是其他页面。
因此,如果您的应用程序仅提供单个页面,并且在不从服务器请求其他页面的情况下注入或删除内容,则可以将其视为SPA。在大多数使用此设计的项目中,您会看到他们只有一个' index.html'页面,其他一切都是javascript文件和模板文件。这就是SPA的全部意义。
答案 1 :(得分:1)
简短回答:这并不重要;使用路由器管理客户端状态将使任何Ember应用程序成为“单页面应用程序”
几乎按照定义,使用路由器的Ember.js应用程序是“单页” - 就像Deif所说的那样,'单页'基本上意味着有一个初始请求请求(html + js + css),javascript Ember应用程序然后初始化客户端,并在Ember应用程序中导航将导致不同的视图呈现/状态更改/数据显示(服务器返回数据由客户端EmberJS应用程序显示,而不是包含在内容中的内容HTML),但它们都在同一个初始页面中。
这可能会与location
设置混淆。默认情况下,Ember将/#
附加到URI,然后是路径路径。您会注意到,当您浏览(通过路径转换)时,#
之后的片段会发生变化 - 但这仍然在同一页面上所以它计为“单页应用。”
那么点击“后退”按钮会发生什么?当每个请求从服务器返回一个新的HTML页面时,很明显:单击“返回”会通过重复GET请求将浏览器带到上一页。但是在javascript应用程序中呢?传统的JS单页应用程序可以“打破”后退按钮 - 您可以导航,更改客户端的状态,但点击后退按钮会返回上一个网站,而不是您单个的前一个“页面”页面应用!
Ember通过路由器+历史记录位置实施解决了破解后的按钮问题 - 设置location
提供了不同的行为。我认为 {{1} }完全禁用历史记录 - 我稍后会尝试。
请参阅:EmberJS History Location 和What should my Rails routes look like to work with pushState Ember.js routes?和EmberJS Routing Guide
答案 2 :(得分:1)
环顾this jsFiddle。您可能会注意到使用哈希实现的一个主要优点:
<a href="#/third">third template</a>
直接指向您应用程序中特定路线的书签链接,无需大惊小怪。
我认为这里可能会发生的事情是:许多SPA框架都没有提供像Ember的路由器位置那样的东西。有了它们,一旦你加载页面,网址永远不会改变。因此,当Ember开始使用浏览器历史记录并且您看到网址发生变化时,您自然会质疑这个您构建的内容是否仍然是SPA。 (它最初也让我失望了!)请放心吧 是SPA。如果它让您感觉更舒服,请使用location: 'none'
来保持单页美感; Ember不在乎,但你的用户可能会。 ;)