javascript - 在 Angular Js 的 RZSlider 中设置 32 小时范围?

标签 javascript angular date

我必须在 32 小时内以 10 分钟的间隔实现一个 RZSlider。我也在使用日期选择器。所以我将这个日期选择器和时间 slider 设置到一个 html 页面中。如果当我登陆此页面时,它应该默认选择今天日期和 8 小时窗口,平均 -4 小时和 +4 小时与当前日期。例如:如果我在 7 月 23 日 23:00 登陆此页面,则范围应为 19:00 至 3:00。但在这种情况下,3:00 进入 7 月 24 日。我想让这个 slider 像带时间的日期选择器一样。

starting from 8:10,8:20,8:30,8:40,8:50,9:10.....12:10,12:20.......23:10,23:20,23:30,23:40,23:50,00:00,00.10,00:20,00:30,00:40,00:50,1:00.......4:00 End To.

我已经为 32 小时范围实现了一些逻辑,但在某些情况下这会失败,然后 slider 会损坏并且会出现兼容问题。 我无法显示我的代码,因为代码依赖于其他代码。

var app = angular.module('rzSliderDemo', ['rzModule', 'ui.bootstrap']);

app.controller('MainCtrl', function($scope, $rootScope, $timeout) {
  var arr = getRange().map(n => {
    return {
      value: n,
      legend: n
    };
  });
  
  $scope.slider = {
    minValue: '10.50',
    maxValue: '14.20',
    options: {
      showTicks: true,
      stepsArray: arr,
      draggableRange: true,
    }
  };
});

function getRange() {
  var arr = [];
  var d = new Date(2017, 1, 1);
  for (var i = 0; i < (6 * 28); i++) {
    d.setMinutes(d.getMinutes() + 10);
    arr.push(leadZero(d.getHours()) + '.' + leadZero(d.getMinutes()));
  }
  return arr;
}

function leadZero(time) {
  return time < 10 ? '0' + time : time;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet"/>
<link href="https://rawgit.com/rzajac/angularjs-slider/master/dist/rzslider.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.14.3/ui-bootstrap-tpls.js"></script>
<script src="https://rawgit.com/rzajac/angularjs-slider/master/dist/rzslider.js"></script>
<div ng-app="rzSliderDemo">
  <div ng-controller="MainCtrl" class="wrapper">
    <header>
      <h1>AngularJS Touch Slider</h1>

    </header>
    <article>
      <h2>Simple slider</h2>
      Model:
      <input type="text" ng-model="slider.minValue" />
      <input type="text" ng-model="slider.maxValue" />
      <br/>
      <rzslider rz-slider-model="slider.minValue" rz-slider-high="slider.maxValue" rz-slider-options="slider.options"></rzslider>
    </article>
  </div>
</div>
在此示例中,它将到第二天 4 小时,但不会到前一天的 4 小时。

最佳答案

我不是很清楚你在追求什么,但希望这会让你走上正轨。

我正在使用 Moment使处理日期更容易。

通过将日期包含在范围值中,它使值变得唯一,因此我们可以毫无歧义地设置初始开始和结束时间。

然后,当您准备好对这些值执行某些操作时,您可以使用 Moment 将选定值转换回日期对象。

var app = angular.module('rzSliderDemo', ['rzModule', 'ui.bootstrap']);

app.controller('MainCtrl', function($scope, $rootScope, $timeout) {
  
  var startDate, endDate, startTime, endTime;
  var currentDate = moment();
  
  var timeData = getRange();
  $scope.localTime = timeData.currentTime; // actually start of this hour
  
  var arr = timeData.times.map(n => {
    return {
      value: n.value
      //legend: n.value
    };
  });
  
  $scope.slider = {
    minValue: $scope.localTime.clone().subtract(4, "hours").format('MMM Do hh:mma'),
    maxValue: $scope.localTime.clone().add(4, "hours").format('MMM Do hh:mma'),
    options: {
      showTicks: true,
      stepsArray: arr,
      draggableRange: true,
    }
  };
});

function getRange(currentDate) {
  var arr = [];
  var totalHourRange = 28;
  var currentTime = moment(); // current date and time using Moment
  
  // set current time to beginning of the hour
  currentTime.minute(0);
  
  // clone date and substract 1/2 total range to get start point
  var tmpTime = currentTime.clone();
  tmpTime.subtract(totalHourRange / 2, 'hours');
  
  // offset is the number of minutes from the current point
  for (var i = -((6 * totalHourRange) / 2); i <= (6 * totalHourRange) / 2; i++) {
    arr.push({value: tmpTime.format('MMM Do hh:mma'), offset: i * 10});
    tmpTime.add(10, 'minutes');
  }
  return { times: arr, currentTime: currentTime, totalHourRange: totalHourRange };
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet"/>
<link href="https://rawgit.com/rzajac/angularjs-slider/master/dist/rzslider.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.14.3/ui-bootstrap-tpls.js"></script>
<script src="https://rawgit.com/rzajac/angularjs-slider/master/dist/rzslider.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
<div ng-app="rzSliderDemo">
  <div ng-controller="MainCtrl" class="wrapper">
    <header>
      <h2>AngularJS Touch Slider</h2>
    </header>
    <article>
      <h4>Local time (beginning of the hour): <em>{{localTime.format('MMMM Do YYYY, h:mm a')}}</em></h4>
      <br />
      Model:
      <input type="text" ng-model="slider.minValue" />
      <input type="text" ng-model="slider.maxValue" />
      <br />
      <br />
      <rzslider rz-slider-model="slider.minValue" rz-slider-high="slider.maxValue" rz-slider-options="slider.options"></rzslider>
    </article>
  </div>
</div>

更新演示:http://jsfiddle.net/stxa9hrp/1/

关于javascript - 在 Angular Js 的 RZSlider 中设置 32 小时范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45350964/

相关文章:

javascript - 将 "2011-06-23T13:20:12+0000"转换为时间之前

javascript - 在 Play 中使用 cookie 刷新页面

javascript - 在提交表单时打开 Bootstrap 模式

angular - 将 `ngModelOptions` 从自定义组件传递到包含的 native 元素

javascript - 使用 ng build --prod 后 Angular2 无法看到图像

javascript - console.log 如何将 javascript 日期对象转换为人类可读的格式

c# - 从 C# 调用 javascript

javascript - 在 Angular 中显示从控制台到 HTML 的简单 JSON 数据

angular - 如何在 Firefox 中正确调试 Angular - 错误 : "[object Object]"

年度 PHP 表单验证