【问题标题】:custom date .filter does NOT show dates in iOS ONLY .split method approach自定义日期 .filter 仅在 iOS 中不显示日期 .split 方法方法
【发布时间】:2016-01-19 01:53:19
【问题描述】:

我们设法以客户希望的方式在我们的应用中显示日期。这对我们来说是一项艰巨的任务,但我们对结果感到满意。我们正在使用 Ionic 框架,仅在 iOS 设备和模拟器上出现以下错误。浏览器和 Android 完美显示日期。

所以我从这里读到有些人对 .split 方法很幸运。我们将其添加到我们的代码中,但继续收到此错误,并且显示内容已损坏 ng-bind {{}}.. 这是来自 iOS 的错误

E R R O R:convDate.split 不是函数。 (在'convDate.split('')'中,'convDate.split'是未定义的)

**Error: convDate.split is not a function. (In 'convDate.split(' ')', 'convDate.split' is undefined)**
file:///var/mobile/Containers/Bundle/Application/104DE270-18AC-4FB1-9F97-66F93E885A0B/driverApp.app/www/js/controllers/BookingsController.js:147:35
fn
regularInterceptedExpression@file:///var/mobile/Containers/Bundle/Application/104DE270-18AC-4FB1-9F97-66F93E885A0B/driverApp.app/www/lib/ionic/js/ionic.bundle.js:23059:37
expressionInputWatch@file:///var/mobile/Containers/Bundle/Application/104DE270-18AC-4FB1-9F97-66F93E885A0B/driverApp.app/www/lib/ionic/js/ionic.bundle.js:22961:42
$digest@file:///var/mobile/Containers/Bundle/Application/104DE270-18AC-4FB1-9F97-66F93E885A0B/driverApp.app/www/lib/ionic/js/ionic.bundle.js:24507:43
$apply@file:///var/mobile/Containers/Bundle/Application/104DE270-18AC-4FB1-9F97-66F93E885A0B/driverApp.app/www/lib/ionic/js/ionic.bundle.js:24783:31
done@file:///var/mobile/Containers/Bundle/Application/104DE270-18AC-4FB1-9F97-66F93E885A0B/driverApp.app/www/lib/ionic/js/ionic.bundle.js:19196:53
completeRequest@file:///var/mobile/Containers/Bundle/Application/104DE270-18AC-4FB1-9F97-66F93E885A0B/driverApp.app/www/lib/ionic/js/ionic.bundle.js:19368:15
requestLoaded@file:///var/mobile/Containers/Bundle/Application/104DE270-18AC-4FB1-9F97-66F93E885A0B/driverApp.app/www/lib/ionic/js/ionic.bundle.js:19309:24
(anonymous function)console-via-logger.js:172
(anonymous function)ionic.bundle.js:21161
(anonymous function)ionic.bundle.js:17940
$digestionic.bundle.js:24532
$applyionic.bundle.js:24782
doneionic.bundle.js:19195
completeRequestionic.bundle.js:19367
requestLoadedionic.bundle.js:19308

我们的日期过滤器代码

  .filter('customDateFilter', function($filter) {
    return function(input) {
      var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'Novemeber', 'December'];
      var weekdays = ['SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY'];
          var convDate = $filter('date')(new Date(input), 'MMMM dd EEEE yyyy');
    var inputDate = convDate.split(' ');
      // SHOW "Today" on today's date instead of actual date O_o
      var showToday = new Date();

      if (convDate === ($filter('date')(new Date(showToday), 'MMMM dd EEEE yyyy')) return "TODAY";
      if (convDate !== ($filter('date')(new Date(showToday), 'MMMM dd EEEE yyyy')) {
        return inputDate[2] + " " + inputDate[0] + " " + inputDate[1];
      }
    };
  })

customeDate fiter 视图中的代码..

<span id="dates-fonts-styles">{{groupedBooking[0].driver_departing_time | customDateFilter}}</span>

对我们的预订进行分组的功能..(不确定是否有必要)

  function setBookingGroupDate(bookings) {
    //*2*Go through each booking
    for (var i = bookings.length - 1; i >= 0; i--) {
      var date = new Date(bookings[i].driver_departing_time); //*3*Create date from drvier_departing_date
      var dateWithoutHour = new Date(date.getFullYear(), date.getMonth(), date.getDate()); //*4* create same date but w/o the hr to minimize the differences
      var dateCode = dateWithoutHour.getTime(); //Get timeStamps to have same filed for all and same type to be able to order and GROUP
      bookings[i].groupByDateCode = dateCode; //add it back to respective booking[index]
    };
    //Return the bookings
    return bookings;
  }

从该代码返回的日期是 1 月 18 日星期一,依此类推.. 只有 iOS 向我们发送错误并显示 {{groupedBooking[0].driver_departing_time |视图上的 customDateFilter}} ..

有人知道是否有解决办法吗?我们尝试了 .split,基于这里的很多好感。

【问题讨论】:

  • 表达式 inputDate === showToday 永远不会为真,因为 showToday 是一个 Date 对象,它只能是 === 自身,而 inputDate 是其他一些值。
  • input 的值是多少,因此new Date(input) 的结果是什么?
  • 您在另一个答案下方回复了这些 cmets。这里的推论是 input 是一个字符串,并且您依赖 Date 构造函数在 new Date(input) 中解析它,这是 never 一个好主意。麻烦的平台可能不会解析字符串并返回无效的日期,因此$filter('date')(...) 不会返回您期望的字符串。您应该始终手动解析日期字符串(库可以提供帮助,但支持特定格式是 2 行代码)。

标签: javascript ios angularjs date split


【解决方案1】:

我认为您可能需要将 convDate 变量显式类型转换为 String。将过滤日期代码更改为以下代码,看看是否有效:

.filter('customDateFilter', function($filter) {
    return function(input) {
      var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'Novemeber', 'December'];
      var weekdays = ['SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY'];
          var convDate = $filter('date')(new Date(input), 'MMMM dd EEEE yyyy');
    convDate = convDate.toString(); //Typecasting convDate to string.
    var inputDate = convDate.split(' '); 
      // SHOW "Today" on today's date instead of actual date O_o
      var showToday = new Date();

      if (inputDate === showToday) return "TODAY";
      if (inputDate !== showToday) {
        return inputDate[2] + " " + inputDate[0] + " " + inputDate[1];
      }
    };
  })

干杯,

【讨论】:

  • convDate.toString() 返回的值是entirely implementation dependent,除非 OP 指定了定制的 Date.prototype.toString 方法。否则,这取决于机会。
  • @RobG 是的 @Shoaib Raza 的建议没有奏效。 (谢谢你!)我发布了一些未完成的代码也是我的错误。 if (inputDate === showToday) return "TODAY"; if (inputDate !== showToday) { 无论如何,当它返回时; return inputDate[2] + " " + inputDate[0] + " " + inputDate[1]; 它在浏览器和 Android 中运行良好,但在 iOS 中则不行。
  • @Shotbyabel——通过推论,inputDate !== showToday 将始终为真,所以您不妨忘记这两个 if 语句,只使用 return inputDate[2] ...
  • @RobG ,if 语句未更新为当前工作代码(请忽略它们)问题是 return 语句不适用于 iOS。
【解决方案2】:

有两件事可以尝试。 如果可以将convDate 类型转换为String,那么您可以尝试

convDate == showToday

双 ==(而不是三重 ===)为您进行类型转换。

或者你也可以尝试通过这个把convDate转成String

convDate = "" + convDate;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多