【发布时间】:2015-01-24 18:05:17
【问题描述】:
我之前遇到过一个问题,我想在以编程方式更新 URL 时阻止页面刷新。
我有一个“家”视图,例如:/books,我有特定的视图:例如:/books/123
主页有几个侧面板和一个包含书籍列表的主面板。 单击一本书时,我只想更新主面板,将页面的其余部分保持原样,但我确实想更新 URL 以反映已加载的书。所有书籍都应该是可直接链接的,因此 URL 反映了这种直接链接。我在加载特定书籍时通过设置 $location.path() 来更新 URL,并在我的 ui-router 状态下使用 reloadOnSearch:false 来防止刷新。
我的路线设置如下:
.state('books', {
url: '/books',
title: 'Books',
templateUrl: CONFIG.static_url + '/html/book.html',
controller: 'BookCtrl'
})
.state('book', {
url: '/books/:itemId',
title: 'Books',
templateUrl: CONFIG.static_url + '/html/book.html',
controller: 'BookCtrl',
reloadOnSearch: false
})
这很好用,但有两个问题。
1) 当从主页“书籍”页面转换到特定书籍时,页面会刷新。当从一本特定的书转换到另一本书时,模型会在不刷新页面的情况下更新(这是所需的行为)。
2) 使用浏览器后退/前进控件时,URL 的更改不会反映在模型中,因此视图不会更新。但是,它在从主页转换到/从主页转换到特定页面时确实有效。
为了解决问题 2,我在 $location.path() 上设置了一个 $watch,所以如果它发生变化并且与模型不匹配,我会加载正确的项目。这似乎工作正常。
但是,问题 1 仍然存在。如何在不刷新整个页面的情况下从主页无缝过渡到特定视图,同时保留浏览器后退/前进功能?我可能可以继续使用 $watch 功能根据 URL 进行更新,但我似乎无法在不刷新页面的情况下加载它。
【问题讨论】:
标签: javascript angularjs angular-ui-router