Angular在懒加载子模块无法触发主模块的interceptor
问题书写了一个service,请求后端,但是无法身份验证拦截,没有将其返回登陆界面
调查通过log的方式检查,发现其本身无法被触发,在intercept钩子中无法触发响应,但是也有其他模块的http service是可以正常访问的
发现与猜测通过代码比对与逻辑思考,发现我当初企图将service挂载在子模块上的行为导致了这个结果(将providedIn改为了any)
而interceptor是挂载在app层的
将providedIn修改为root即可修复该问题
在网上进行搜索的时候发现大部分人也没有修改过providedIn这个DI配置项。。。也就没啥找到可以参考的案例
猜测是模块隔离导致的无法访问,暂且先搁置
先记录下来,以便之后review
2020-09-16
interceptor
jasmine-angular
使用angular自带的unit-test框架引言Angular集成了一个unit-test框架,比起react和vue那种自己找unit-test框架,有时候还会发现官方文档挂着的unit-test库已经不维护的蛋疼感要好不少,这也算是angular用起来的一个很大的优点了
Angular集成了的框架其实是jasmine,本身是可以脱离angular单独运行的,不过由于是angular主动集成的,所以angular提供了很多可以测试用的工具,以在jasmine中直接运行,这确实省了很多力气
基本使用方法jasmine的基本使用很简单,和其他的几个单测框架差不多,主要就是分为生命周期,断言
github地址文档
Simple Sample Codedescribe("A suite is just a function", function() {
var a;
it("and so is a spec", function() {
a = true;
expect(a).toBe(true);
});
});
基
2020-09-10
unit-test
函数防抖
函数防抖短时间内多次触发同一事件,只执行一次
目的只执行最后一次,或者只执行最开始的一次,中间的不执行。
实现// 合成版
/**
* @desc 函数防抖
* @param func 目标函数
* @param wait 延迟执行毫秒数
* @param immediate true - 立即执行, false - 延迟执行
*/
function debounce(func, wait, immediate) {
let timer;
return function() {
let context = this,
args = arguments;
if (timer) clearTimeout(timer);
if (immediate) {
let callNow = !timer;
timer = setTimeout(() => {
timer = null;
2020-07-07
编程常见方式
函数节流
函数节流函数节流是主要取消一段时间内的多次调用
目的在一定时间内,比如一秒内只调用一次,然后下一秒内再调用一次
实现具体的实现方式,其实是使用的一个变量作为开关,以控制节流的是否处罚
// 时间戳版
function throttle(func, wait) {
let previous = 0;
return function() {
let now = Date.now();
let context = this;
let args = arguments;
if (now - previous > wait) {
func.apply(context, args);
previous = now;
}
}
}
content.onmousemove = throttle(count,1000);
这段代码参考来源
第一个参数为方法,为节流时调用的函数
第二个参数为防抖时间,用于防抖的延迟时间
2020-07-07
编程常见方式
网页端通过url直接打开pc版钉钉
钉钉统一开发协议
PC端统一跳转协议(我照抄的)html页面填写钉钉PC端指定链接,当用户点击链接时,唤起PC客户端,并执行相应操作。
如打开个人profile页链接:
打开个人profile页,在站点挂个人钉钉联系方式,点击打开个人profile页,步骤如下:
第一步,确认钉钉号:在钉钉移动客户端“我的”,打开”我的信息”页面下查看,钉钉号为xxxxxx;
第二步,替换{id},替换后链接为
dingtalk://dingtalkclient/action/sendmsg?dingtalk_id=xxxxxx;
第三步,打开个人profile页示例:PC端打开个人profile页,点击钉钉联系我。
注意: PC端统一跳转协议暂时不支持服务端获取 dingtalk_id,若页面在钉钉PC端容器内执行,可尝试使用 biz.util.open(需要改跳转链接)JSAPI打开个人资料页。
如何实现客户端注册urlScheme实现原理:window是把自定义协议写入注册表,打开对应exe程序mac是在Info.plist文件添加CFBundleURLTypes
参考文章:实现网页调起PC
2020-01-20
前端
记一个ie下特有的代码情况
起因起因是接到了一个bug,说是代码在ie下运行,无法正常运行。当时想了一下,那不是理所当然的嘛,没有接babel-polyfill,所以打不开是正常的一踏糊涂,代码里还有不少Promise相关的代码。
结果出现了反转,他们说打开了f12(控制台)以后,跟我说界面可以正常加载出来了。我当时就???????了
然后我喊上了我的同事,一起来围观ie11下的神秘问题。
然后他表示
这是我工作以来碰到的最神秘的bug
好了,这下懵逼的人又多了一个
调查既然出现了这么有趣的问题,那怎么可以放过它呢。。
通过在google上搜索关键字 ie11 不开 调试器 查到了一个很相似的网页内容
救星啊!!曙光啊!!女神啊!!
然后点了进去
女神他门坏啦!!!女神他穿上了坦克装甲!!!
不过幸好的是,我们找到了关键字,所以我们继续按照这个页面的关键字进行检索,他已经给出了大方向
我们将关键字修改为
ie11 调试器 除非启动
果不其然,正确答案出现了(按F进入坦克)
正确答案
https://xbuba.com/questions/44036862
在这篇文章中,将这个问题的关键描绘了出
2019-12-30
前端
regex零宽断言
为啥写这篇文章呢,起因其实是因为收到了一个神秘的链接,也就是下面的万恶之源,然后让我又涨了新姿势
万恶之源
这本质上是一个javascript的正则表达式锻炼网站,学习网站。
在写level 2的时候,踩入了一个深坑,想了半天也么想到一个好的有效的办法,当时就懵了
本质上是匹配ipv6的地址,题目如下
Jan 13 00:48:59: DROP service 68->67(udp) from 213.92.153.167 to 69.43.107.219, prefix: "spoof iana-0/8" (in: eth0 69.43.112.233(38:f8:b7:90:45:92):68 -> 217.70.100.113(00:21:87:79:9c:d9):67 UDP len:576 ttl:64)
Jan 13 12:02:48: ACCEPT service dns from 74.125.186.208 to firewall(pub-nic-dns), prefix: "none" (in: eth0 74.1
2019-12-12
regex
前端分层结构(mvc->mvvm)的前世今生
本文章含有较多的主观成分,交流为主,大部分内容会参杂个人理解,如有差错,请读者指出mvc首先,我们从MVC这个经典的结构开始说起
mvc的结构分层模式(其实说是模式也很勉强,只是单纯的分层),在那个大部分都是服务端直出的年代,这个结构分层的主要目的,是将原本代码直接从Model直接转化为View的这种强耦合形式进行拆分,使得View层和Model层实现弱耦合的形式,从而达到Model/View复用的形式,其实其本质就是将界面层和数据层进行了分离。
直观一点说是,将原本在jsp页面上直接取数据库字段的行为,修改为了由控制器去获得数据,然后Controller拿到数据后,将数据再渲染到view层。这样做的好处是显而易见的
将数据库字段和界面进行了解耦,不用因为界面需要,而将同一数据源的数据进行转换后再存一次
将界面逻辑进行简化,不需要将每个显示数据的地方进行数据适配
当数据源变动时,只需要将Controller中取值部分进行修改,将数据变动在Controller层进行封装,这样可以实现比较优秀的数据复用
当然这里的Controller层并不是一味的指单纯的Controller,它承载
2019-11-28
前端