2016-02-23 71 views
1

我正在開發一個使用AngularJS + Angular Material + Electron的簡單秒錶應用程序,並且不知何故數據更改/手錶被延遲,直到另一個UI交互發生(?)這從來沒有發生過我使用Bootstrap,我可以確認它不是Electron,這是問題。Angular Material應用程序 - 延遲更改

由於我今天剛開始使用這些,我已經使用了最新版本的AngularJS,Angular Material和Electron,所有這些都與Bower一起使用。

編輯:這裏有筆:http://codepen.io/anon/pen/jWgzev

這裏的地方:在應用啓動:

start

在按下播放按鈕,計時器開始倒計數至零,並播放按鈕被取代:

then

而當計時器降爲零,按鈕應該已經被橙色停止按鈕所取代,但它不會發生:

enter image description here

而當你將鼠標懸停在兩個按鈕中的一個屏幕方面,灰色按鈕神奇地轉變爲橙色:

enter image description here

如果我張貼的代碼塊我提前道歉,我只是不知道哪裏出了問題。

HTML:

<!doctype html> 
<html class="no-js" lang="" ng-app="breaktime-stopwatch"> 
    <head> 
     <meta charset="utf-8"> 
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 
     <title></title> 
     <meta name="description" content=""> 
     <meta name="viewport" content="width=device-width, initial-scale=1"> 
     <link rel="apple-touch-icon" href="apple-touch-icon.png"> 

     <link rel="stylesheet" href="styles/normalize.min.css"> 
     <link rel="stylesheet" href="styles/main.css"> 
     <link rel="stylesheet" href="styles/font-awesome.min.css"> 
     <link href="./bower_components/angular-material/angular-material.css" rel="stylesheet" /> 
     <link rel="stylesheet" href="styles/app.css"> 

     <!--<script src="scripts/vendor/modernizr-2.8.3.min.js"></script>--> 
     <script> 
      window.nodeRequire = require; 
      delete window.require; 
      delete window.exports; 
      delete window.module; 
     </script> 
    </head> 
    <body ng-controller="AppController as vm" layout="column"> 
     <md-toolbar layout="row"> 
      <div class="md-toolbar-tools"> 
       <span> 
        <h1 class="md-title">Breaktime Stopwatch</h1> 
       </span> 
       <!-- fill up the space between left and right area --> 
       <span flex></span> 
       <md-button href="" class="md-icon-button"> 
        <md-icon md-font-icon='fa fa-question-circle fa-2x'></md-icon> 
        <md-tooltip md-direction="left"> 
         About and Help 
        </md-tooltip> 
       </md-button> 
      </div> 
     </md-toolbar> 
     <md-content layout="column" layout-padding> 
      <div flex layout="row" layout-align="center center"> 
       <!--<md-progress-circular md-mode="indeterminate" md-diameter="50"></md-progress-circular>--> 
       <!--<md-progress-circular md-mode="determinate" ng-value="meter" md-diameter="50"></md-progress-circular>--> 
       <timer class="clock md-display-4" autostart="false" interval="1000" countdown="break_duration" finish-callback="stopTimer()">{{minutes}}:{{seconds}}</timer> 

      </div> 
      <div layout="row" layout-align="center center"> 
       <span ng-if="playButton"> 
        <md-button class="md-fab md-primary" aria-label="Play" ng-click="startTimer()"> 
         <md-icon md-font-icon='fa fa-play fa-2x'></md-icon> 
         <md-tooltip md-direction="top"> 
          Start 
         </md-tooltip> 
        </md-button> 
       </span> 
       <span ng-if="stopEarlyButton"> 
        <md-button class="md-fab md-accent" aria-label="Stop Earlier" ng-click="stopEarlyTimer()"> 
         <md-icon md-font-icon='fa fa-stop fa-2x'></md-icon> 
         <md-tooltip md-direction="top"> 
          Stop 
         </md-tooltip> 
        </md-button> 
       </span> 
       <span ng-if="stopButton"> 
        <md-button class="md-fab md-warn" aria-label="Stop" ng-click="stopTimer()"> 
         <md-icon md-font-icon='fa fa-exclamation fa-2x'></md-icon> 
         <md-tooltip md-direction="top"> 
          Stop 
         </md-tooltip> 
        </md-button> 
       </span> 
      </div> 
     </md-content> 





     <!--[if lt IE 8]> 
      <p class="browserupgrade">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p> 
     <![endif]--> 
     <!--pre-dependencies--> 

     <script src="scripts/plugins.js"></script> 
     <!--dependencies--> 
     <script src="./bower_components/jquery/dist/jquery.min.js" type="text/javascript" ></script>   
     <script src="./bower_components/angular/angular.js" type="text/javascript" ></script> 
     <script src="./bower_components/angular-animate/angular-animate.js" type="text/javascript" ></script> 
     <script src="./bower_components/angular-aria/angular-aria.js" type="text/javascript" ></script> 
     <script src="./bower_components/angular-material/angular-material.js" type="text/javascript" ></script> 
     <script src="./bower_components/momentjs/min/moment.min.js" type="text/javascript" ></script> 
     <!--<script src="./bower_components/momentjs/min/locales.min.js" type="text/javascript" ></script>--> 
     <script src="./bower_components/humanize-duration/humanize-duration.js" type="text/javascript" ></script> 
     <script src="./bower_components/angular-timer/dist/angular-timer.min.js" type="text/javascript" ></script> 
     <!--application config--> 
     <script src="scripts/app.js"></script> 
     <!-- Google Analytics: change UA-XXXXX-X to be your site's ID. --> 
     <!--<script> 
      (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]= 
      function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date; 
      e=o.createElement(i);r=o.getElementsByTagName(i)[0]; 
      e.src='//www.google-analytics.com/analytics.js'; 
      r.parentNode.insertBefore(e,r)}(window,document,'script','ga')); 
      ga('create','UA-XXXXX-X','auto');ga('send','pageview'); 
     </script>--> 
    </body> 
</html> 

JS:

(function() { 

    'use strict'; 

    var btsw = angular.module('breaktime-stopwatch', [ 
     'ngMaterial', 
     'timer' 
    ]); 

    btsw.config(function($mdThemingProvider) { 
     $mdThemingProvider.theme('default') 
      .primaryPalette('indigo') 
      .accentPalette('grey'); 
    }); 

    btsw.controller('AppController', function AppController($scope, $mdDialog){ 
     $scope.timerRunning = false; 
     $scope.playButton = true; 
     $scope.stopEarlyButton = false; 
     $scope.stopButton = false; 
     $scope.break_duration = 10; 
     $scope.break_var = angular.copy($scope.break_duration); 
     // $scope.meter = 0; 

     $scope.startTimer = function(){ 
      $scope.$broadcast('timer-start'); 
      $scope.timerRunning = true; 
      $scope.playButton = false; 
      $scope.stopEarlyButton = true; 
     }; 

     $scope.stopEarlyTimer = function(){ 
      $scope.$broadcast('timer-stop'); 
      $scope.timerRunning = false; 
      $scope.playButton = true; 
      $scope.stopEarlyButton = false; 
     }; 

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

     $scope.test = function(){ 
      console.log($scope.break_duration); 
      console.log($scope.break_var); 
      // console.log($scope.meter); 
     } 

     $scope.$on('timer-tick', function (event, data) { 
       $scope.break_var = data.millis/1000; 

       // if($scope.meter < Math.round(100-(($scope.break_var/$scope.break_duration)*100))) 
       // {$scope.meter = Math.round(100-(($scope.break_var/$scope.break_duration)*100));} 
       // console.log($scope.meter); 
     }); 

    }); 
})(); 

任何形式的幫助,將我指向正確的方向將不勝感激!

+1

如果您可以通過www.codepen.io提供一個最簡單的示例,它可以幫助我們更輕鬆地調試問題。 –

+0

更新我的問題,增加了一支筆。 –

回答

1

在不挖掘到定時器代碼太多,我猜測的finish-callback功能,它提供可在消化循環結束運行,或完全外部角的消化週期(這是一個有點奇怪,因爲它的一個Angular模塊)。

如果是這種情況,只需在您的$scope.stopTimer()函數末尾添加$scope.$digest();即可。

這裏是一個更新的Codepen它按預期工作:http://codepen.io/topherfangio/pen/bEXXNj

編輯:作爲一個側面說明:它徘徊按鈕,因爲工具提示觸發消化週期後,改變你的Codepen。

+1

我有一個預感,不知何故它也在計時器中,但不能把它放在手指上。謝謝你,現在它正在工作! :d –