2014-10-16 49 views
0

在IE11中运行我们的AngularJS应用程序时,在调试器中一切看起来都很棒,但是当我们的应用程序将数据编码为JSON以保存到我们的数据库时,我们会得到不好的结果。Funky IE JSON转换

我们的应用程序从我们的数据库中获取记录,然后进行一些操作,然后将数据从另一个模型保存回服务器。

这是我在下面的setAttendanceGetSInfo()函数得到了从服务器返回的数据:

{"data":{"Start":"2014-10-16T19:36:00Z","End":"2014-10-16T19:37:00Z"}, 

这是用来在我们的模型中的“数据转换”,以3个属性代码:

var setAttendanceGetSInfo = function (CourseId, PID) { 
    return setAttendanceInfo(CourseId, PID) 
    .then(function (result) { 
     return $q.all([ 
      $http.get("../api/Axtra/getSInfo/" + model.event.Id), 
      $http.get("../api/Axtra/GetStartAndEndDateTime/" + aRow.Rid) 
     ]); 
    }).then(function (result) { 
     var r = result.data; 
     var e = Date.fromISO(r.Start); 
     var f = Date.fromISO(r.End); 
     angular.extend(model.event, { 
      examDate: new Date(e).toLocaleDateString(), 
      examStartTime: (new Date(e)).toLocaleTimeString(), 
      examEndTime: (new Date(f)).toLocaleTimeString() 
     }); 
     return result.sInfo; 
    }); 
}; 

fromISO被定义为:

(function(){ 
    var D= new Date('2011-06-02T09:34:29+02:00'); 
    if(!D || +D!== 1307000069000){ 
     Date.fromISO= function(s){ 
      var day, tz, 
      rx=/^(\d{4}\-\d\d\-\d\d([tT ][\d:\.]*)?)([zZ]|([+\-])(\d\d):(\d\d))?$/, 
      p= rx.exec(s) || []; 
      if(p[1]){ 
       day= p[1].split(/\D/); 
       for(var i= 0, L= day.length; i<L; i++){ 
        day[i]= parseInt(day[i], 10) || 0; 
       }; 
       day[1]-= 1; 
       day= new Date(Date.UTC.apply(Date, day)); 
       if(!day.getDate()) return NaN; 
       if(p[5]){ 
        tz= (parseInt(p[5], 10)*60); 
        if(p[6]) tz+= parseInt(p[6], 10); 
        if(p[4]== '+') tz*= -1; 
        if(tz) day.setUTCMinutes(day.getUTCMinutes()+ tz); 
       } 
       return day; 
      } 
      return NaN; 
     } 
    } 
    else{ 
     Date.fromISO= function(s){ 
      return new Date(s); 
     } 
    } 
})() 

看看电动车的截图耳鼻喉科模型数据:

Screemshot of Model

但是,如果我EVAL使用JSON.stringify(model.event)事件模型,我得到这个:

{\"examDate\":\"?10?/?16?/?2014\",\"examStartTime\":\"?2?:?44?:?00? ?PM\",\"examEndTime\":\"?2?:?44?:?00? ?PM\"} 

,这是JSON编码,实际上得到了存储在数据库的数据:

"examDate":"¿10¿/¿16¿/¿2014","examStartTime":"¿2¿:¿36¿:¿00¿ ¿PM","examEndTime":"¿2¿:¿37¿:¿00¿ ¿PM" 

这里有什么问题,我该如何解决这个问题?它的工作原理与Chrome和Firefox中的设计完全相同。我还没有在Safari或早期版本的IE上进行测试。

回答

0

首先,我修改了fromISO原型此:

(function() { 
    var D = new Date('2011-06-02T09:34:29+02:00'); 
    if (!D || +D !== 1307000069000) { 
     Date.fromISO = function (s) { 
      var D, M = [], hm, min = 0, d2, 
       Rx = /([\d:]+)(\.\d+)?(Z|(([+\-])(\d\d):(\d\d))?)?$/; 
      D = s.substring(0, 10).split('-'); 
      if (s.length > 11) { 
       M = s.substring(11).match(Rx) || []; 
       if (M[1]) D = D.concat(M[1].split(':')); 
       if (M[2]) D.push(Math.round(M[2] * 1000));// msec 
      } 
      for (var i = 0, L = D.length; i < L; i++) { 
       D[i] = parseInt(D[i], 10); 
      } 
      D[1] -= 1; 
      while (D.length < 6) D.push(0); 
      if (M[4]) { 
       min = parseInt(M[6]) * 60 + parseInt(M[7], 10);// timezone not UTC 
       if (M[5] == '+') min *= -1; 
      } 
      try { 
       d2 = Date.fromUTCArray(D); 
       if (min) d2.setUTCMinutes(d2.getUTCMinutes() + min); 
      } 
      catch (er) { 
       // bad input 
      } 
      return d2; 
     } 
    } 
    else { 
     Date.fromISO = function (s) { 
      return new Date(s); 
     } 
    } 

    Date.fromUTCArray = function (A) { 
     var D = new Date; 
     while (A.length < 7) A.push(0); 
     var T = A.splice(3, A.length); 
     D.setUTCFullYear.apply(D, A); 
     D.setUTCHours.apply(D, T); 
     return D; 
    } 

    Date.toJSON = function (key) { 
     return isFinite(this.valueOf()) ? 
       this.getUTCFullYear() + '-' + 
      f(this.getUTCMonth() + 1) + '-' + 
      f(this.getUTCDate()) + 'T' + 
      f(this.getUTCHours()) + ':' + 
      f(this.getUTCMinutes()) + ':' + 
      f(this.getUTCSeconds()) + 'Z' : null; 
    }; 
})() 

然后我说moment.js和格式化d阿泰当他们得到存储:

var SaveAffRow = function() { 
    // make sure dates on coursedate and event are correct. 
    var cd = model.a.courseDate; 
    var ed = model.event.examDate; 
    var est = model.event.examStartTime; 
    var eet = model.event.examEndTime; 
    model.a.courseDate = moment(cd).format("MM/DD/YYYY"); 
    model.event.examDate = moment(ed).format("MM/DD/YYYY"); 
    model.event.examStartTime = moment(est).format("MM/DD/YYYY hh:mm A"); 
    model.event.examEndTime = moment(eet).format("MM/DD/YYYY hh:mm A"); 
    affRow.DocumentsJson = angular.toJson({a: model.a, event: model.event}); 

    var aff = {}; 

    if (affRow.Id != 0) 
     aff = affRow.$update({ Id: affRow.Id }); 
    else 
     aff = affRow.$save({ Id: affRow.Id }); 
    return aff; 
}; 

,当他们得到读(以防万一,他们已经搞砸):

var setAttendanceGetSInfo = function (CourseId, PID) { 
    return setAttendanceInfo(CourseId, PID) 
    .then(function (result) { 
     return $q.all([ 
      $http.get("../api/Axtra/getSInfo/" + model.event.Id), 
      $http.get("../api/Axtra/GetStartAndEndDateTime/" + aRow.Rid) 
     ]); 
    }).then(function (result) { 
     var r = result.data; 
     var e = Date.fromISO(r.Start); 
     var f = Date.fromISO(r.End); 
     angular.extend(model.event, { 
      examDate: moment(e).format("MM/DD/YYYY"), 
      examStartTime: moment(e).format("MM/DD/YYYY hh:mm A"), 
      examEndTime: moment(f).format("MM/DD/YYYY hh:mm A") 
     }); 
     return result.sInfo; 
    }); 
}; 
0

对于所有浏览器,日期类的toJSON没有完全定义。

(你可以看到一个相关的问题在这里:Discrepancy in JSON.stringify of date values in different browsers

我会怀疑你有一个自定义的,因为你的日期字符串不符合标准的toJSON添加到日期原型,并很可能在您的问题或者,你可以使用上面的帖子推荐日期的toJSON为您解决问题