FireFox中的$ interpolation错误

时间:2013-12-24 20:53:41

标签: javascript angularjs firefox

我的日期来自数据库,如下所示: 2013-11-21 17:43:20

以下代码在FireFox中有问题,但在Chrome中运行良好:

<ul class="job-lookup-results" ng-show="data" style="padding:0 10px;">
    <li class="job-lookup-result" ng-repeat="result in data" style="margin:5px 0; font-size:80%;"><a href="/admin/jobs/edit/{{result.Job.id}}" class="job-lookup-result-link">{{result.Job.name}}</a> ({{result.Job.id}}), {{result.Company.name}}, {{result.Job.created | dateToISO | date:'shortDate'}}</li>
    <li class="job-lookup-result" ng-hide="data.length > 0">No matches found.</li>
</ul>

这是错误:

[15:17:40.890] "Error: [$interpolate:interr] http://errors.angularjs.org/1.2.5/$interpolate/interr?p0=%20(%7B%7Bresult.Job.id%7D%7D)%2C%20%7B%7Bresult.Company.name%7D%7D%2C%20%7B%7Bresult.Job.created%20%7C%20dateToISO%20%7C%20date%3A'shortDate'%7D%7D&p1=RangeError%3A%20invalid%20date
...

我不明白错误,但如果它与我的自定义过滤器有关,那么它就是:

app.filter('dateToISO', function() {
  return function(input) {
    input = new Date(input).toISOString();
    return input;
  };
});

更新 当我删除| dateToISO |时,它可以正常工作。所以它似乎连接到自定义过滤器。

3 个答案:

答案 0 :(得分:3)

好吧,既然FireFox对于错误的日期格式(Chrome忽略了它),你就必须手动修复格式。过滤器仍然是可行的方法。

<强>标记:

<div>{{Object.created | badDateToISO | date:'shortDate'}}</div>

JavaScript的:

app.filter('badDateToISO', function() {
  return function(badTime) {
    var goodTime = badTime.replace(/(.+) (.+)/, "$1T$2Z");
    return goodTime;
  };
});

<强> Live demo here (click).

答案 1 :(得分:0)

result.Job.created采用默认的MySQL日期时间格式(例如“2013-12-25 13:12:01”),但Firefox无法直接使用此格式创建日期对象。

因此,您需要通过拆分输入日期时间字符串并使用带有new Date(year, month [, day, hour, minute, second, millisecond]);语法的单独部分来构造Date对象:

app.filter('mysqlToISO', function() {
  return function(input) {
    var p = input.split(/[- :]/);
    /* new Date(year, month [, day, hour, minute, second, millisecond]); */
    return new Date(p[0], p[1]-1, p[2], p[3], p[4], p[5]);
  };
});

app.controller('ctrl', function($scope){
    $scope.date = "2013-12-25 13:12:01";
});
<body ng-controller="ctrl">
  {{date | mysqlToISO | date:'shortDate'}}
</body>

或者,你使用了一个受欢迎的momentjs库。

答案 2 :(得分:0)

对我来说唯一有效的跨浏览器格式是:

var date = new Date(input); // Where input is '2013-12-25T13:12:01' for example