发表于: 2017-07-22 21:48:26
0 847
今天完成的事情:修复了edge上日报时间错误的bug,调试第九肌肉接口
明天计划的事情:继续调第九肌肉的接口
遇到的问题:
一、edge上日报时间错误
原因:通过getResponseHeader获取到的时间是null,应该是兼容性问题,还没有找到完美的解决办法
var time = req.getResponseHeader("Date");
所以服务器上获取不到时就用本地时间
// edge浏览器上有问题,获取不到时间。获取不到就用本地时间。
if(!time) {
time = new Date();
}
其实最初写这个服务时,想到了可能从服务器上获取不到时间,但是没有写这个判断,因为当时是这么想的:如果从服务器上获取不到时间了,就说明服务器出问题了,应该让这个问题显露出来,这样才好发现问题,然后解决。
但是没有想到的是,获取不到时间不仅仅可能是由于服务器出问题了,居然存在浏览器的兼容问题,这是当时完全没有想到的一点。
二、从萝卜多搬过来的搜索插件不好用,改了一下:
搜索插件最后在跳转时,会把$scope.params经过commonUtil.querySearchParams服务处理一下,让时间插件的结束时间字段加上86400000 - 1
$state.go($state.current, commonUtil.querySearchParams($scope.params), {reload: true});
但是这个时间戳处理的服务太难用了,只要检测到属性名字中包含end或者to字符的,就会执行处理结束时间的处理:
// 时间戳处理
querySearchParams: function (params) {
for (var k in params) {
if (params[k] instanceof Date) {
params[k] = new Date(params[k]).getTime();
console.log("params[k]",params[k]);
}
// 处理 结束时间 那天末尾
if ((k.toLowerCase().indexOf('end') != -1||k.toLowerCase().indexOf('to') != -1) && params[k]) {
var timeString = String(params[k]);
var str = timeString.substring(timeString.length - 1, timeString.length);
if (str != '9') {
params[k] = params[k] + 86400000 - 1;
}
}
if (k === 'page') {
params[k] = 1;
}
}
return params;
}
这显然写的很愚蠢,太容易和其他字段弄混了,指令的适用性太弱了
所以改了一下:
一、把不要调用commonUtil.querySearchParams服务了,把相关的代码直接写到搜索指令中去
二、把需要进行时间处理的参数的名字传到插件中去,精确判断
用起来就像这样:
html中:
日期插件:
<input type="text" class="form-control" size="20" bs-datepicker autoclose="true"
data-date-format="yyyy-MM-dd" data-date-type="number"
data-max-date="today" ng-model="vm.searchParams.registerTo">
搜索指令:
<search params="vm.searchParams" time-fix-arr="vm.timeFixArr"></search>
控制器中:
/把需要日历插件需要+86399999的参数的名字以字符串放进来,写在html日期插件的属性里,给search插件去处理
vm.timeFixArr = ["registerTo"];
通过一个数组,将属性的名字放进来,直接告诉指令哪些属性需要处理就行了。这样用起来虽然没那么方便了,但能很直观的告诉使用者,这个指令会做什么。
////////////////////////////////////
在指令中的实现:
//对日历插件的时间处理
for (var i in $scope.params) {
for (var j in $scope.timeFixArr) {
if (i == $scope.timeFixArr[j]) {
//取到尾数毫秒
var unit = $scope.params[i]%10;
if (unit != 9) {
$scope.params[i] = $scope.params[i] + 86400000 - 1;
}
}
}
}
//对page的处理
if ($scope.params.page) {
$scope.params.page = 1;
}
收获:知道了指令中下面这两种写法的区别:都是双向绑定,但是名字有大写字母时,就需要用到下面这种方式,
params: '=',
timeFixArr: '=timeFixArr',
在html上使用时,属性名不用大写字母,换成 - 分隔
<search params="vm.searchParams" time-fix-arr="vm.timeFixArr"></search>
评论