AngularJS <a>标记链接不工作
我有从search返回的对象的索引。 该模板具有ng-repeat,其中项目的URL是从模型中的数据构build的,但是在最终的标记中,“a”标记不起作用。 ng-href和href是正确的,当链接被点击但是页面不加载时,URL栏会改变。 点击后进行浏览器刷新确实得到页面。 所以在Angular的东西是改变url栏,但不触发负载?
无法在jsfiddle中进行重现,因为问题似乎是在$ resource.query()函数之后将json加载到模板中,我无法从jsfiddle中执行此操作。 使用模拟查询加载静态数据,即使最终的标记看起来相同,jsfiddle也能正常工作。
AngularJS模板如下所示:
<div ng-controller="VideoSearchResultsCtrl" class="row-fluid"> <div class="span12" > <div class="video_thumb" ng-repeat="video in videos"> <p> <a ng-href="/guides/{{video._id}}" data-method="get"> <img ng-src="{{video.poster.large_thumb.url}}"> </a> </p> </div> </div> </div>
结果看起来不错,并产生以下最后的标记:
<div ng-controller="VideoSearchResultsCtrl" class="row-fluid ng-scope"> <div class="span12"> <!-- ngRepeat: video in videos --><div class="video_thumb ng-scope" ng-repeat="video in videos"> <p> <a ng-href="/guides/5226408ea0eef2d029673a80" data-method="get" href="/guides/5226408ea0eef2d029673a80"> <img ng-src="/uploads/video/poster/5226408ea0eef2d029673a80/large_thumb_2101146_det.jpg" src="/uploads/video/poster/5226408ea0eef2d029673a80/large_thumb_2101146_det.jpg"> </a> </p> </div><!-- end ngRepeat: video in videos --> </div> </div>
控制器代码是:
GuideControllers.controller('VideoSearchResultsCtrl', ['$scope', '$location', 'VideoSearch', function($scope, $location, VideoSearch) { $scope.videos = VideoSearch.query({ namespace: "api", resource: "videos", action: 'search', q: $location.search().q }); } ]);
使用AngularJS 1.2-rc.3。 我也尝试使用ng-click和常规的旧onclick来获取甚至使用静态URL加载页面,但点击从不触发代码。 顺便说一句,这个页面上的静态无angular链接可以工作,所以菜单栏和注销工作。
我在这里做错了什么,或者这是AngularJS中的错误?
从邮件列表中我得到了一个答案:
你有没有把你的$ locationProviderconfiguration成html5Mode? 如果是,这会导致你的问题。 您可以强制它通过添加target =“_ self”到您的标签始终转到url。 试一试。
我已经configuration使用HTML5,所以添加target="_self"
到标签解决了问题。 仍然在研究为什么这个工作。
我知道这个post是旧的,但我最近遇到了这个问题。 我的.html页面有基地
//WRONG! <base href="/page" />
并修复:
//WORKS! <base href="/page/" />
注意'页面'后的反斜杠('/')。
不知道这是否适用于其他情况,但试试吧!
不知道这个post是否已经被更新过了,但是你可以在应用程序启动时进行configuration。 将rewriteLinks设置为false会重新启用您a
标记,但仍会html5mode
,这会带来所有的好处。 我已经添加了一些围绕这些设置的逻辑来恢复window.history
不支持(IE8)浏览器中的html5mode
app.config(['$locationProvider', function ($locationProvider) { if (window.history && window.history.pushState) { $locationProvider.html5Mode({ enabled: true, requireBase: true, rewriteLinks: false }); } else { $locationProvider.html5Mode(false); } }]);
$ locationProvider上的angular度文档
html5mode vs hashbang模式的好处
AngularJS遭遇了一个稀less的文件,我希望他们获得动力将改善它。 我认为AngularJS主要是作为一个SPA ,也许背后的想法默认情况下,所有的标签允许一个人很容易将angular度合并到一些已经存在的HTML。
这允许将“传统”网站(以及彼此之间链接的脚本页面)的默认“路由”行为快速重构成angular度路由系统,这更多地是MVC方法,更适合于Web应用。
find这一行:
$locationProvider.html5Mode(true)
更改为:
$locationProvider.html5Mode(true).hashPrefix('!')
并在index.html的头部包含这一行,如果你没有。
<base href="/">