以前の回答のほとんどの問題は、「href ハッシュ/フラグメント/ID」を含む「リンク」をクリックしたときにルートが変更されない場合、ember ルーターが以前のほとんどを実行するために必要なフックを起動しないことです。ソリューション。
これは、ユーザーが「ナビゲーション/インデックスまたはリンクのリスト」からページの関連セクション (利用規約やページについてなど) にジャンプできるようにする複数の「見出し」を持つページで明らかです。
このような状況では、ルートが変更されていなくてもクエリ パラメータが変更されている場合でも、ルーターがそのフックを起動するように、ember では「完全な遷移を選択する」必要があります。詳細については、「完全移行へのオプトイン」を参照してください。
注:この「オプトイン」を使用したときに発生する唯一の文書化されたフックは、モデル フックです。
この「完全な移行」オプトインは、並べ替えやフィルタリングなどのクエリ パラメータの変更でモデルを更新する場合にのみ使用することを意図していたと思います。
確かに、これはちょっとしたハックのように思えますが、上記の「オプトイン」を使用して、問題の div /anchor タグまでスクロールできます。将来的には、オプトインは他のより適切なフックも起動できるようになる可能性があります (setupController は特に便利です)。
また、他の誰かがグーグルしている場合。また、ルートで「willTransition」および「didTransition」アクションも使用してみました。悲しいことに、他のルートから遷移するときに発射されましたが、同じルートからそれ自体に遷移するときにも発射に失敗します。
最後に、ブラウザーを問題の ID までスクロールさせるには、dom を完全にロードする必要があることは明らかなはずです (最初はそうではありませんでした)。Ember.run.schedule('afterRender',
そのため、コールバック内でスクロールを実行する必要があります。
参考までに、現時点で一般的に利用可能な最新の ember-cli、ember.js、および ember-data を使用しています。
- エンバークリ: 1.13.7
- 残り火: 1.13.6
- 残り火データ: 1.13.7
app/router.js
this.route('about', {
queryParams: ['anchor']
});
ルート/about.js
import Ember from 'ember';
export default Ember.Route.extend({
queryParams: {
anchor: {
refreshModel: true
}
},
model: function(params) {
var aboutController = this.controllerFor('about');
aboutController.set('anchorLocation', params.anchor);
}
});
アプリ/コントローラー/about.js
import Ember from "ember";
export default Ember.Controller.extend({
queryParams: ['anchor'],
anchor: '',
showAnchor: function() {
var _this = this;
Ember.run.schedule('afterRender', function scrollToAnchor(){
var elem = Ember.$(_this.anchorLocation);
elem.get(0).scrollIntoView(true);
});
}.observes('anchorLocation'),
});
app/templates/footer.js
<ul>
<li>
{{#link-to "about" (query-params anchor='#contact')}}Contact{{/link-to}}
</li>
<li>
{{#link-to "about" (query-params anchor='#support')}}Support{{/link-to}}
</li>
<li>
{{#link-to "about" (query-params anchor='#team')}}Team{{/link-to}}
</li>
</ul>