【发布时间】:2014-12-14 07:11:48
【问题描述】:
我有一个 Angular SPA,它根据一些餐厅数据的不同部分(参见 m.amsterdamfoodie.nl)提供各种推荐列表和 Google 位置地图。我希望这些列表中的每一个都有自己的 URL。为了让 Google 抓取不同的列表,我使用<a> 标签进行画布导航。
目前<a>标签会导致视图刷新,这在地图上非常明显。
- 我可以使用
ng-click和$event.preventDefault()来防止这种情况发生(参见下面的代码sn-ps),但是我需要实现一种更新浏览器URL 的方法。 - 但是在尝试 Angular 的
$state或浏览器的history.pushstate时,我最终会触发状态更改和视图刷新...!
因此,我的问题是如何在不刷新视图的情况下更新模型和 URL?(另请参阅 Angular/UI-Router - How Can I Update The URL Without Refreshing Everything?)
我尝试了很多方法,目前有这个html
<a href="criteria/price/1" class="btn btn-default" ng-click="main.action($event)">Budget</a>
在控制器中:
this.action = ($event) ->
$event.preventDefault()
params = $event.target.href.match(/criteria\/(.*)\/(.*)$/)
# seems to cause a view refresh
# history.pushState({}, "page 2", "criteria/"+params[1]+"/"+params[2]);
# seems to cause a view refresh
# $state.transitionTo 'criteria', {criteria:params[1], q:params[2]}, {inherit:false}
updateModel(...)
而且,我认为正在发生的是我正在触发$stateProvider 代码:
angular.module 'afmnewApp'
.config ($stateProvider) ->
$stateProvider
.state 'main',
url: '/'
templateUrl: 'app/main/main.html'
controller: 'MainCtrl'
controllerAs: 'main'
.state 'criteria',
url: '/criteria/:criteria/:q'
templateUrl: 'app/main/main.html'
controller: 'MainCtrl'
controllerAs: 'main'
一个可能的线索是,如果我加载下面的代码,例如http://afmnew.herokuapp.com/criteria/cuisine/italian 然后视图会在您导航时刷新,而如果我加载 http://afmnew.herokuapp.com/ 则不会刷新,而是不会更新 URL。我完全不明白为什么会这样。
【问题讨论】:
-
我还没有深入研究过这篇文章,但你可能会觉得它很有趣。 weluse.de/blog/angularjs-seo-finally-a-piece-of-cake.html
-
不幸的是,这是关于预渲染,而我的问题是关于以 SEO 友好的方式导航 SPA
-
你见过 ui-sref 吗?状态配置中还有 reloadOnSearch 参数吗?
-
reloadOnSearch 看起来可能有帮助,但它是 ui.router 的一部分吗?
标签: angularjs seo angular-ui-router single-page-application