Angularjs でアンカー リンクを使用することは可能ですか?
すなわち:
<a href="#top">Top</a>
<a href="#middle">Middle</a>
<a href="#bottom">Bottom</a>
<div name="top"></div>
...
<div name="middle"></div>
...
<div name="bottom"></div>
ありがとうございました
Angularjs でアンカー リンクを使用することは可能ですか?
すなわち:
<a href="#top">Top</a>
<a href="#middle">Middle</a>
<a href="#bottom">Bottom</a>
<div name="top"></div>
...
<div name="middle"></div>
...
<div name="bottom"></div>
ありがとうございました
これを行うにはいくつかの方法があるようです。
Angular は$anchorScroll
サービスを提供していますが、ドキュメントが著しく不足しており、機能させることができませんでした。
についての洞察については、http://www.benlesh.com/2013/02/angular-js-scrolling-to-element-by-id.htmlをご覧ください$anchorScroll
。
私がテストしたもう 1 つの方法は、カスタム ディレクティブを作成してel.scrollIntoView()
. これは、基本的にディレクティブリンク関数で次のことを行うことで、かなり適切に機能します。
var el = document.getElementById(attrs.href);
el.scrollIntoView();
ただし、ブラウザがネイティブでサポートしている場合、これらの両方を行うのは少し誇張されているように思えますよね?
http://docs.angularjs.org/guide/dev_guide.services.$locationとその HTML リンク書き換えセクションを見ると、次のリンクが書き換えられていないことがわかります。
対象要素を含むリンク
例:
<a href="/ext/link?a=b" target="_self">link</a>
target
したがって、次のように属性をリンクに追加するだけです。
<a href="#anchorLinkID" target="_self">Go to inpage section</a>
Angular のデフォルトはブラウザーであり、別のベース URL ではなくアンカー リンクであるため、ブラウザーは必要に応じて正しい場所にスクロールします。
オプション 3 を選択しました。これは、ここではネイティブのブラウザー機能に依存するのが最善であり、時間と労力を節約できるからです。
スクロールとハッシュの変更が成功した後、Angular はフォローアップしてハッシュをカスタム スタイルに書き換えることに注意してください。ただし、ブラウザはすでにその役割を果たしているので、準備は万端です。
それがあなたの質問に答えるかどうかはわかりませんが、はい、次のようなangularjsリンクを使用できます。
<a ng-href="http://www.gravatar.com/avatar/{{hash}}"/>
AngularJSWebサイトに良い例があります。
http://docs.angularjs.org/api/ng.directive:ngHref
更新:AngularJSのドキュメントは少しあいまいで、適切なソリューションを提供していませんでした。ごめん!
ここでより良い解決策を見つけることができます:AngularJSでアンカーハッシュリンクを処理する方法
anchorScrollを使用してみてください。
したがって、コントローラーは次のようになります。
app.controller('MainCtrl', function($scope, $location, $anchorScroll, $routeParams) {
$scope.scrollTo = function(id) {
$location.hash(id);
$anchorScroll();
}
});
そしてビュー:
<a href="" ng-click="scrollTo('foo')">Scroll to #foo</a>
...アンカー ID のシークレットはありません:
<div id="foo">
This is #foo
</div>
$anchorScroll は確かにこれに対する答えですが、最近のバージョンの Angular ではそれを使用するためのはるかに優れた方法があります。
現在、$anchorScroll はオプションの引数としてハッシュを受け入れるため、$location.hash をまったく変更する必要はありません。(ドキュメント)
ルートにはまったく影響しないため、これが最適なソリューションです。私は ngRoute を使用していて$location.hash(id)
、 $anchorScroll がその魔法を実行する前に、設定するとすぐにルートがリロードされるため、他のソリューションを機能させることができませんでした。
これを使用する方法は次のとおりです...最初に、ディレクティブまたはコントローラーで:
$scope.scrollTo = function (id) {
$anchorScroll(id);
}
そしてビューで:
<a href="" ng-click="scrollTo(id)">Text</a>
また、固定ナビゲーション バー (または他の UI) を考慮する必要がある場合は、次のように $anchorScroll のオフセットを設定できます (メイン モジュールの run 関数内)。
.run(function ($anchorScroll) {
//this will make anchorScroll scroll to the div minus 50px
$anchorScroll.yOffset = 50;
});
私は同じ問題を抱えていましたが、これは私にとってはうまくいきました:
<a ng-href="javascript:void(0);#tagId"></a>
私にとって最良の選択は、作業を行うためのディレクティブを作成することでした。これは、URL$location.hash()
を
$anchorScroll()
ハイジャックすると、SPA ルーティングに多くの問題が発生するためです。
MyModule.directive('myAnchor', function() {
return {
restrict: 'A',
require: '?ngModel',
link: function(scope, elem, attrs, ngModel) {
return elem.bind('click', function() {
//other stuff ...
var el;
el = document.getElementById(attrs['myAnchor']);
return el.scrollIntoView();
});
}
};
});
または、単に次のように書くこともできます。
ng-href="\#yourAnchorId"
ハッシュ記号の前のバックスラッシュに注意してください
SharePoint と angular を使用している場合は、以下のようにします。
<a ng-href="{{item.LinkTo.Url}}" target="_blank" ng-bind="item.Title;" ></a>
ここで、LinkTo と Title は SharePoint 列です。