2017-08-01 23 views
1

我使用RZslider作爲日期和選擇器。但是我又面臨一些問題,並且非常惱火。而且在Rzlider和angularJs中也是新的。所以滑塊包含8小時當前時間+ 4小時和-4小時。如果我運行滑塊,那麼它包含當前時間和-4,+4,示例如果當前時間是10:00,則滑塊對齊06:00到14:00。
在Angular Js中選擇日期之後,不要失去之前Rzslider的位置?

屏幕截圖:
enter image description here
然後如果我改變滑塊拖動一樣,選擇然後再次約會滑塊後自帶的默認電流值。但我不想在選擇日期後更改滑塊位置。因爲如果我更改滑塊並選擇日期,那麼我將點擊一個應用按鈕,然後我將獲得開始日期,時間和結束日期,時間。

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

 
app.controller('MainCtrl', function($scope, $rootScope, $timeout) { 
 
    $scope.$watch('dateBirth', function(n, o) { 
 
    var newDay = n || new Date(); 
 
    $scope.selectedDate = moment(newDay); 
 
    $scope.selectedDate.hour(moment().hour()); 
 
    $scope.selectedDate.minute(0); 
 
    $scope.init(); 
 
    }); 
 
    
 
    $scope.init = function() { 
 
    var startDate, endDate, startTime, endTime; 
 
    
 
    var timeData = getRange($scope.selectedDate); 
 
    $scope.localTime = timeData.currentTime; // actually start of this hour 
 
    
 
    var arr = timeData.times.map(n => { 
 
     return { 
 
     value: n.value 
 
     //legend: n.value 
 
     }; 
 
    }); 
 
    
 
    $timeout(function(){ 
 
     $scope.slider = { 
 
     minValue: $scope.localTime.clone().subtract(4, "hours").format('YYYY DD MMM HH:mm'), 
 
     maxValue: $scope.localTime.clone().add(4, "hours").format('YYYY DD MMM HH:mm'), 
 
     options: { 
 
      showTicks: true, 
 
      stepsArray: arr, 
 
      draggableRange: true, 
 
     } 
 
     }; 
 
    }); 
 
    } 
 
    
 
    $scope.init(); 
 
}); 
 

 
function getRange(currentDate) { 
 
    var arr = []; 
 
    var totalHourRange = 32; 
 
    var currentTime = currentDate || 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'); 
 
    tmpTime.hour(0).subtract(4, '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('YYYY DD MMM HH:mm'), 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> 
 
     <div class="form-group"> 
 
     <label for="choos-birth" class="control-label">choose date:</label> 
 
     <div class="control"> 
 
      <input id="choos-birth" class="form-control" type="date" ng-model="dateBirth" style="witdh:100px;"> 
 
     </div> 
 
     </div> 
 
     
 
     <br /> 
 
     <rzslider rz-slider-model="slider.minValue" rz-slider-high="slider.maxValue" rz-slider-options="slider.options"></rzslider> 
 
    </article> 
 
    </div> 
 
</div>

所以如果我運行演示,然後我改變滑塊位置後選擇其他日期則滑塊轉到原來的位置(默認位置按目前的時間)。所以我不想在選擇值後重置滑塊值。

+0

你的意思是與滑塊你挑時間(10:00爲例),那麼你更改日期的日期選擇器,然後滑點11 :00再次,你想要的滑塊將保持在10:00,但與新的日期? –

+0

@Mosh Feu。是的,我想用拖動滑塊設置日期。 –

+0

@MoshFeu。我會解釋。如果我運行這個例子。拖動滑塊並指向不同的時間。之後,如果我選擇日期,則滑塊會根據默認時間轉到上一個位置。但我想如果我拖動滑塊並選擇日期,那麼滑塊不會移到上一個位置。 –

回答

1

邏輯是存儲maxValueminValue小時。然後,當日期發生變化時,將新日期與舊時間(如果存在)結合起來。

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

 
app.controller('MainCtrl', function($scope, $rootScope, $timeout) { 
 
    $scope.$watch('dateBirth', function(n, o) { 
 
    var newDay = n || new Date(); 
 
    $scope.selectedDate = moment(newDay); 
 
    $scope.selectedDate.hour(moment().hour()); 
 
    $scope.selectedDate.minute(0); 
 
    $scope.init(); 
 
    }); 
 
    
 
    $scope.init = function() { 
 
    var startDate, endDate, startTime, endTime; 
 
    
 
    var timeData = getRange($scope.selectedDate); 
 
    $scope.localTime = timeData.currentTime; // actually start of this hour 
 
    
 
    var arr = timeData.times.map(n => { 
 
     return { 
 
     value: n.value 
 
     //legend: n.value 
 
     }; 
 
    }); 
 
    
 
    $timeout(function() { 
 
     $scope.slider = { 
 
     minValue: $scope.getValue($scope.valueTypes.MIN), 
 
     maxValue: $scope.getValue($scope.valueTypes.MAX), 
 
     options: { 
 
      stepsArray: arr, 
 
      showTicks: true, 
 
      draggableRange: true, 
 
      onChange: function() { 
 
      $scope.minValueHour = moment($scope.slider.minValue).get('hour'); 
 
      $scope.maxValueHour = moment($scope.slider.maxValue).get('hour'); 
 
      } 
 
     } 
 
     }; 
 
    }); 
 
    } 
 
    
 
    $scope.valueTypes = { 
 
    MIN: 'min', 
 
    MAX: 'max' 
 
    }; 
 
    
 
    $scope.getValue = function(kind) { 
 
    var localTime = $scope.localTime.clone(); 
 
    
 
    if ($scope[kind + 'ValueHour']) { 
 
     localTime.set({hour: $scope[kind + 'ValueHour']}); 
 
    } 
 
    else { 
 
     var method = kind === 'min' ? 'subtract' : 'add'; 
 
     localTime[method](4, "hours") 
 
    } 
 
    
 
    return localTime.format('YYYY DD MMM HH:mm'); 
 
    } 
 
    
 
    $scope.init(); 
 
}); 
 

 
function getRange(currentDate) { 
 
    var arr = []; 
 
    var totalHourRange = 32; 
 
    var currentTime = currentDate || 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'); 
 
    tmpTime.hour(0).subtract(4, '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('YYYY DD MMM HH:mm'), 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> 
 
     <div class="form-group"> 
 
     <label for="choos-birth" class="control-label">choose date:</label> 
 
     <div class="control"> 
 
      <input id="choos-birth" class="form-control" type="date" ng-model="dateBirth" style="witdh:100px;"> 
 
     </div> 
 
     </div> 
 
     
 
     <br /> 
 
     <rzslider rz-slider-model="slider.minValue" rz-slider-high="slider.maxValue" rz-slider-options="slider.options"></rzslider> 
 
    </article> 
 
    </div> 
 
</div>

http://jsbin.com/zenaco/edit?html,js

相關問題