setUpLocationChangeListener:设置位置变化监听器。该侦听器检测从路由器外部触发的导航(例如,浏览器后退/前进按钮)并相应地安排路由器导航,以便触发正确的守卫事件。Angular路由文档提到:如果您单击浏览器的后退按钮而不是应用程序的“后退”按钮,应用程序也会将您返回到英雄列表。Angular应用程序导航会像普通Web导航一样更新浏览器历史记录。如果您单击浏览器的后退按钮而不是应用程序的后退按钮,应用程序还会将我们返回到英雄列表。Angular应用程序导航会像普通的Web导航一样更新浏览器历史记录。根据谷歌的一份调查报告,移动设备上约有20%的页面访问是通过后退和前进按钮进行的??。在考虑用户应该如何体验后退或前进导航时,我们确实有一个理想的体验——基于特定移动平台的原生应用。比如Android维护了一堆Activity。当用户导航到另一个页面时,这个堆栈项目将被关闭。当你回来时,只需重新打开它。结果,页面的状态以极其有效的方式显示给用户。实际上,浏览器将为每个导航创建一个新框架。无论是同站内跳转还是跨域跳转,浏览器都会卡住页面。这包括拍摄页面快照以及其他元数据。此外,该页面上的所有工作,包括任何延迟的任务,如setTimeout,都将停止,直到通过bfcache再次访问该页面。当用户使用后退或前进按钮导航回堆栈中的某个项目时,浏览器会从缓存中获取它并将其呈现给用户而不刷新内容。这包括所有可能变化的输入元素状态。换句话说,这是一种有状态的浏览。在SPA或单页应用程序中,当用户与浏览器的后退按钮交互时,他们实际上并没有导航到新的HTML页面。我们在window.onpopstate上与history.pushState和history.replaceState等API进行交互。在SPA中使用后退和前进按钮的缺点是绘制DOM和从浏览器缓存中检索资源的成本。如果文档非常大,即使从浏览器缓存中检索资源也会很昂贵。此外,保持先前的滚动位置可能很棘手。在Ember.js社区中,ember-router-scroll已成为帮助SPA实现这一目标的关键。但是,对于延迟加载的DOM元素和包含大量内容的大型文档,它也很棘手。当然,导航前页面的冻结状态将有助于任何SPA恢复上次滚动的位置。但是,这将需要不同的浏览器API来解决上面提出的一些问题。
