在之前的版本中滚动条位置是一个大问题,主要表现在

1. 使用快捷键或者手势前进/后退的时候,滚动条的位置经常是错乱的,所以只能每个页面都要重置一个滚动条的位置;

2. #anchor1 锚点位置无法定位

2017年10月开始解决这个问题,历时7个月终于在 6.1 beta1 中解决了。

解决方案就是增加了一个全新的特性 Scroll Position Restoration,滚回到之前的位置。

有人详细介绍了这个特性,点我查看

今天我尝试了一下 ViewportScroller 的 scrollToAnchor,跳转到锚点。

//注入 ViewportScroller
constructor(private scroller: ViewportScroller) { }
  async ngOnInit() {
    //初始化数据之后,滚到 id='foot' 的元素那里
    this.scroller.scrollToAnchor('foot');
  }

在页面底部添加一个 id='foot' 的元素,注意要保证该元素超过浏览器的视野,不然就不会出现滚动条了,也就看不到效果了。

测试结果很成功,于是改成正式代码

 ngOnInit() {
//初始化
this.scroller.scrollToAnchor(this.route.snapshot.fragment);
}

结果报错了

Uncaught (in promise): SyntaxError: Failed to execute 'querySelector' on 'Document': '#8e2c2c4e-3722-4645-bd12-af14da8cef96' is not a valid selector.
Error: Failed to execute 'querySelector' on 'Document': '#8e2c2c4e-3722-4645-bd12-af14da8cef96' is not a valid selector.

原来是 selector 选择器不正确,但是为什么不正确呢?看看它的实现就知道了。

// https://github.com/angular/angular/pull/20030/files
+ scrollToAnchor(anchor: string): void {
+ if (this.supportScrollRestoration()) {
+ const elSelectedById = this.document.querySelector(`#${anchor}`);
+ if (elSelectedById) {
+ this.scrollToElement(elSelectedById);
+ return;
+ }
+ const elSelectedByName = this.document.querySelector(`[name='${anchor}']`);
+ if (elSelectedByName) {
+ this.scrollToElement(elSelectedByName);
+ return;
+ }
+ }
+ }

原来内部调用的是 querySelector,在 MDN 上看一下文档,原来必须是 css 选择器

Note: Characters that are not part of standard CSS syntax must be escaped using a backslash character. Since JavaScript also uses backslash escaping, be especially careful when writing string literals using these characters. See Escaping special characters for more information.

而我的代码里用的是 GUID,由于以数字开头,所以不符合语法规范。解决办法就很简单了,在它前面加一个字母就行了。

 ngOnInit() {
//初始化
this.scroller.scrollToAnchor('a'+this.route.snapshot.fragment);
}

别忘了在 HTML 模版中的锚点中也要加上这个字母。

ng6.1 新特性:滚回到之前的位置的更多相关文章

  1. Java8 新特性学习

    摘自:https://blog.csdn.net/shuaicihai/article/details/72615495 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda ...

  2. Oracle 11g新特性

    文章转自网络 Oracle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(I ...

  3. 11g新特性-概述 (转)

    一.新特性提纲 1.数据库管理部分 ◆数据库重演(Database Replay) 这一特性可以捕捉整个数据的负载,并且传递到一个从备份或者standby数据库中创建的测试数据库上,然后重演负责以测试 ...

  4. Oralce 11g新特性 转载

    Oracle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(Informat ...

  5. SQL Server 2008新特性——策略管理

    策略管理是SQL Server 2008中的一个新特性,用于管理数据库实例.数据库以及数据库对象的各种属性.策略管理在SSMS的对象资源管理器数据库实例下的“管理”节点下,如图: 从图中可以看到,策略 ...

  6. 降低 80% 的读写响应延迟!我们测评了 etcd 3.4 新特性(内含读写发展史)

    作者 | 陈洁(墨封)  阿里云开发工程师 导读:etcd 作为 K8s 集群中的存储组件,读写性能方面会受到很多压力,而 etcd 3.4 中的新特性将有效缓解压力,本文将从 etcd 数据读写机制 ...

  7. [转帖]降低 80% 的读写响应延迟!我们测评了 etcd 3.4 新特性(内含读写发展史)

      降低 80% 的读写响应延迟!我们测评了 etcd 3.4 新特性(内含读写发展史) https://www.cnblogs.com/alisystemsoftware/p/11555426.ht ...

  8. SQL Server 2014 新特性——内存数据库

    SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 ...

  9. IOS第三天-新浪微博 - 版本新特性,OAuth授权认证

    *********版本新特性 #import "HWNewfeatureViewController.h" #import "HWTabBarViewController ...

随机推荐

  1. Python之深浅拷贝

    拷贝就是拷贝,何来深浅之说? Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果 其实这个是由于共享内存导致的结果 浅拷贝 l1 = [1,2,3 ...

  2. 巩固java(五)----通过实例理解java多态

    package duotai; class A{ public String show(){ return "A"; } } class B extends A{ public S ...

  3. linux下怎么样上传下载文件夹

    Linux下目录复制:本机->远程服务器 scp -r /home/shaoxiaohu/test1 zhidao@192.168.0.1:/home/test2 test1为源目录,test2 ...

  4. 干货 | Java中获取类名的3种方法!

    获取类名的方法 Java 中获取类名的方式主要有以下三种. getName() 返回的是虚拟机里面的class的类名表现形式. getCanonicalName() 返回的是更容易理解的类名表示. g ...

  5. 错误:编码GBK的不可映射字符

    当Java源代码中包含中文字符时,我们在用javac编译时会出现"错误:编码GBK的不可映射字符". 由于JDK是国际版的,我们在用javac编译时,编译程序首先会获得我们操作系统 ...

  6. float_array.go

    )         if err != nil {             log.Fatalf("Could not parse: %s", s)             ret ...

  7. 【BZOJ 3534】: [Sdoi2014]重建

    题目大意:(略) 题解: 相对误差……我好方. 考虑答案应该为所有合法答案概率之和.对于一个合法的生成树,其出现概率应为所有选取边的概率出现的积 乘以 所有未选取边不出现概率的积. 即: $\;\pr ...

  8. b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子图

    b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子 题意:n*m个植物,每个植物有分数(可正可负),和能保护植物的位置.只能从右往左吃,并且不能吃正被保护着的,可以一个不吃,求 ...

  9. laravel5.4 后台RBAC功能完成中遇到的问题及解决方法

    1.在后台模块中有些公共的地方 比如头部 尾部 左侧菜单栏; 在laravel中通过继承模板来实现,但是在做RBAC的时候 需求是:不同的登陆用户显示不同的菜单;去数据库获取这些数据 但是每个界面都要 ...

  10. MYSQL—— 启动MYSQL 57 报错“The service MYSQL57 failed the most recent........等”的问题解决方式!

    每天开机之后,启动MYSQL Notifier就报错,第一次出现重启电脑后解决,后面的几天老是出现,重启电脑好几次都没有解决,感觉很烦人,一定要搞定这个问题找到原因,于是有了下文....... 启动M ...