发表于: 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>



返回列表 返回列表
评论

    分享到