let temp = window.setTimeout;然后去接管它
window.setTimeout = function(fn, time) { temp(function() { console.log('额外操作:定时器函数执行之前'); fn(); console.log('额外操作:定时器函数执行之后'); }, time); };为了避免污染全局变量,可以放到自执行匿名函数中
;(function(_setTimeout) { window.setTimeout = function(fn, time) { _setTimeout(function() { console.log('额外操作:定时器函数执行之前'); fn(); console.log('额外操作:定时器函数执行之后'); }, time); }; })(window.setTimeout);setTimeout包裹完成,可以像往常一样调用它试试
setTimeout(() => { console.log('我将在1.5s后执行'); }, 1500);这时setTimeout指向的并非是浏览器提供的默认setTimeout函数,而是我们的自定义函数 zone.js正是通过这种方式对所有异步进行了包裹,并暴露出一些“钩子函数”,使原生API可以被注入一些自定义行为 对angular来说,它可以在这些“钩子函数”中,去进行新旧值的对比并对视图做出对应的改动 zone.js对日常开发带来的意义在于,它让浏览器中的异步变得可定制 当然,千万不要在angular中去对异步进行二次包裹(除非你非常清楚自己在做什么并且认为有必要这样做), 这极可能会覆盖angular本身对异步的第一次包裹,使程序产生不可预料的行为 最后,zone.js是一个独立的库,并非依赖于angular,你可以很轻松的使你的angular应用不依赖它 在项目文件的最外层,找到main.ts文件,改写配置
platformbrowserDynamic().bootstrapModule(AppModule, {ngzone: 'noop'}) .catch(err => console.error(err));此时你的项目再运行看看,尽管数据更改了,但视图没有发生任何改变 如果想要视图更改的话,需要引入ApplicationRef,然后在构造函数中注入,接着在所有数据发生改变的地方调用tick方法触发“脏值检查”
import { Component, ApplicationRef } from '@angular/core'; constructor(private app: ApplicationRef) { } this.app.tick();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。