siddii / angular-timer

re-usable/inter-operable AngularJS timer directive ⛺
http://siddii.github.io/angular-timer/
MIT License
793 stars 939 forks source link

resume timer #279

Open alainib opened 7 years ago

alainib commented 7 years ago

I'm trying to make a stop & resume action. This is not working for me. For example the time left is 50seconds, i press "stop" (the left time stop) and wait 10 secondes, then press resume, the time jump to 40 seconds instead of 49. It is like it stop only the display !

my html

` {{hours}}:{{minutes}}:{{seconds}}

<button ng-click="resumeTimer()">resumeTimer</button>`

In controller :

 $scope.stopTimer = function (){
     $scope.$broadcast('timer-stop');
     $scope.timerRunning = false;
  };

  $scope.resumeTimer = function (){
     $scope.$broadcast('timer-resume');
     $scope.timerRunning = false;
  };

I'm using the angular-timer - v1.3.4

thanks

sercul commented 7 years ago

+1 for me resume also is not working

scofield-ua commented 7 years ago

I had similar problem. Here is my html template:

<timer start-time="some date" autostart="false" interval="1000">
<% hhours %>:<%mminutes%>:<%sseconds%>
</timer>

And the problem was same to what @alainib is described. I paused timer then unpause it later and it's starts count not from stopping date but from start-time value I set before in the template.

I solved this problem by editing this lines:

if ($attrs.startTime !== undefined){
   $scope.millis = moment().diff(moment($scope.startTimeAttr));
}

The problem here is that this part it's skipping $scope.startTime date value that changed by calling $scope.stop and $scope.resume functions, so I had to change those line to this:

if ($attrs.startTime !== undefined) {
   if($scope.startTime === null) {
      $scope.millis = moment().diff(moment($scope.startTimeAttr));
   } else {
      $scope.millis = moment().diff(moment($scope.startTime));
   }
}

Or smaller:

if ($attrs.startTime !== undefined) {
    $scope.millis = $scope.startTime === null ? moment().diff(moment($scope.startTimeAttr)) : $scope.millis = moment().diff(moment($scope.startTime));  
}

Hope this would be helpful to someone.

alainib commented 7 years ago

Your help is very appreciated thanks I tried your fix but it doesn't work for me.

    function calculateTimeUnits() {
       var timeUnits = {}; //will contains time with units

       console.log("calculateTimeUnits"+$attrs.startTime); // always undefined 

       if ($attrs.startTime !== undefined){
         if ($attrs.startTime !== undefined) {

           // this logs are never called
           console.log("$scope.startTimeAttr"+$scope.startTimeAttr);
           console.log("$scope.startTimeAttr"+$scope.startTime);
           if($scope.startTime === null) {
             $scope.millis = moment().diff(moment($scope.startTimeAttr));
           } else {
             $scope.millis = moment().diff(moment($scope.startTime));
           }
         }
       } 
       ....

How did you start & stop timer please ? I use this :

      $scope.stopTimer = function (){
        $scope.$broadcast('timer-stop');
      };

      $scope.resumeTimer = function (){
        $scope.$broadcast('timer-resume');
      };
wivancic commented 7 years ago

When I used the timer as a directive in Ionic 1 Framework, I has to broadcast events as $rootScope.$broadcast in order to for the directive to see them. However this also worked and is probably a better solution. Use commands like document.getElementByID if you have multiple directives and give them and ID combined with document.getElementsByTagName('timer')[0].stop() to stop and "[0].start" to start.

See: https://searchcode.com/codesearch/view/85611717/

scofield-ua commented 7 years ago

@alainib make suer your "timer library" script looks same like this and especially this part.

Here is demo with modified script and with creator's script.

alainib commented 7 years ago

happy new year @scofield-ua thanks for taking time to make the codepen I try your code and work, in fact i use end-time option and still doesn't work

http://codepen.io/anon/pen/rjBQWO?editors=1010

thanks

amaheshwari-systango commented 7 years ago

@scofield-ua @siddii @alainib Timer resume functionality for multiple timers Hi I have a list of multiple timers where a user can select which timer he wishes to resume from a list of timers.

user 1: test, time accrued: 5 seconds

user 2: test 2, time accrued: 10 seconds ........ How to set timer directive which is running to make it resume from user 1 time & resume from user 2 when i select user 2 time.

start-time attribute isn't working can you explain how to achieve this.

how can i resume my timer from a predefined time from my controller because i'm using a one single timer that will record and push events according to the list item selected. The mutilple timer example doesn't works for me because it is using different timers and not a single timer directive.