2017-08-02 17 views
0

$ location.path()を$ intervalの内部で使用して、タブからタブへ自動的に移動しようとしています。

しかし、私が$ location.path(x)を呼び出すときはいつでも、現在のビューだけをリロードします。次のように

私のコードは次のとおりです。

tabsController.js

(function() { 
    var injectParams = ['$location', '$routeParams', '$scope', '$rootScope', '$interval', 'teleAiDiagnosticsConfig']; 

    var TabsController = function ($location, $routeParams, $scope, $rootScope, $interval, teleAiDiagnosticsConfig) { 
     var vm = this; 

     $rootScope.autoNavInterval = {}; 
     $rootScope.AutoNavActive = false; 

     $scope.tabs = [ 
      { link: '#!/vehicles', label: 'Vehicles', active: (($location.$$url.indexOf('/vehicle') !== -1) ? true : false) }, 
      { link: '#!/workzones', label: 'Workzones', active: (($location.$$url.indexOf('/workzone') !== -1) ? true : false) }, 
      { link: '#!/operatorStations', label: 'Operator Stations', active: (($location.$$url.indexOf('/operatorStation') !== -1) ? true : false) }, 
      { link: '#!/sessionStatus/123', label: 'Session Status (123)', active: (($location.$$url.indexOf('/sessionStatus') !== -1) ? true : false) } 
     ]; 

     // find the tab that should be marked as active 
     for (var i = 0; i < $scope.tabs.length; i++) { 
      if ($scope.tabs[i].active == true) { 
       $scope.selectedTab = $scope.tabs[i]; 
       break; 
      } 
     } 

     if ($scope.selectedTab == undefined) 
      $scope.selectedTab = $scope.tabs[0]; 

     $scope.setSelectedTab = function (tab) { 
      $scope.selectedTab = tab; 
     } 

     $scope.tabClass = function (tab) { 
      if ($scope.selectedTab == tab) { 
       return "active"; 
      } else { 
       return ""; 
      } 
     } 

     $scope.nextTab = function() { 
      for (var i = 0; i < $scope.tabs.length; i++) { 
       if ($scope.tabs[i] == $scope.selectedTab) { 
        if (i == $scope.tabs.length - 1) { 

         $location.path($scope.tabs[0].link); 
         if (!$scope.$$phase) $scope.$apply() 

         $scope.tabs[0].active = true; 
         $scope.selectedTab = $scope.tabs[0]; 
         break; 
        } 

        else { 

         $location.path($scope.tabs[i + 1].link); 
         if (!$scope.$$phase) $scope.$apply() 

         $scope.tabs[i + 1].active = true; 
         $scope.selectedTab = $scope.tabs[i + 1]; 
         break; 
        } 
       } 
      } 
     } 

     $scope.startAutoNav = function() { 
      $rootScope.AutoNavActive = true; 
      $rootScope.autoNavInterval = $interval(function() { 
       $scope.nextTab(); 
      }, teleAiDiagnosticsConfig.autoNavTimer); 
     } 

     $scope.stopAutoNav = function() { 
      $rootScope.AutoNavActive = false; 
      $interval.cancel($rootScope.autoNavInterval); 
     } 

     $scope.startAutoNav(); 
    }; 

    TabsController.$inject = injectParams; 

    angular.module('teleAiDiagnostics').controller('TabsController', TabsController); 
}()); 

をはい、はい、私は$ rootScopeがお勧めされていない使用して知っています。 $ location.path()が働いたら変更します。

if (!$scope.$$phase) $scope.$apply()行の有無にかかわらず試しました。私も$location.replace()への呼び出しを追加しようとしましたが、これは私のために何もしません。

$ location.path()が呼び出されるたびに、ビューセクションが点滅しますが、Vehiclesビューがリロードされます。

enter image description here

app.js

(function() { 
    var app = angular.module('teleAiDiagnostics', ['ngRoute', 'ngAnimate', 'ui.bootstrap']); 

    app.config(['$routeProvider', function ($routeProvider) { 
     var viewBase = 'app/views/'; 

     $routeProvider 
      .when('/vehicles', { 
       controller: 'VehiclesController', 
       templateUrl: viewBase + 'vehicles.html', 
       controllerAs: 'vm' 
      }) 
      .when('/vehicle/:id', { 
       controller: 'VehicleController', 
       templateUrl: viewBase + "vehicle.html", 
       controllerAs: 'vm' 
      }) 
      .when('/workzones', { 
       controller: 'WorkzonesController', 
       templateUrl: viewBase + 'workzones.html', 
       controllerAs: 'vm' 
      }) 
      .when('/workzone/:id', { 
       controller: 'WorkzoneController', 
       templateUrl: viewBase + "workzone.html", 
       controllerAs: 'vm' 
      }) 
      .when('/operatorStations', { 
       controller: 'OperatorStationsController', 
       templateUrl: viewBase + 'operatorStations.html', 
       controllerAs: 'vm' 
      }) 
      .when('/operatorStation/:id', { 
       controller: 'OperatorStationController', 
       templateUrl: viewBase + 'operatorStation.html', 
       controllerAs: 'vm' 
      }) 
      .when('/sessionStatus/:id', { 
       controller: 'SessionStatusController', 
       templateUrl: viewBase + 'sessionStatus.html', 
       controllerAs: 'vm' 
      }) 
      .otherwise({ redirectTo: '/vehicles' }); 
    }]); 

    // Intialize slider 
    $('.flexslider').flexslider({ 
     animation: 'slide', 
     slideshow: true, 
     pauseOnAction: true, 
     controlNav: true, 
     pauseOnHover: true, 
     touch: true, 
     directionalNav: false, 
     direction: 'horizontal', 
     slideshowSpeed: 6000, 
     smoothHeight: true 
    }); 


}()); 

ないのはなぜこれが動作していないことを確認。私は見つけることができたすべてのヒントに従ってきましたが、私はまだ同じ結果を得ています。私は自分のアプリケーションにUI-Routerを追加し、私のルートを州に置き換えるだけでいいのです。

+1

'$ location.path($ scope.tabs [i + 1] .link)'を呼んでいるときは、接頭辞付きのパスを渡しています。それを取り除き、それが役立つかどうか確認できますか? '$ location.path($ scope.tabs [i + 1] .link.replace( '#!'、 ''))'のようなものです。 –

+0

Stanislavに感謝します。私達は両方同時にそれを理解したように見える。 – Ian

+0

うまくいきました。 Btw、なぜ '$ scope 'をcontrollerAs' var vm = this; 'と一緒に使うのですか?そして、なぜ本当に 'if(!$ scope。$$ phase)$ scope。$ apply()'が本当に必要なのかわかりません。 –

答えて

0

見つけました。この問題は、URLのハッシュ・バング(#!)に関連していました。

ハッシュバングを含まないタブ定義へのリンクを追加しました。これは今では完全に機能しています。

tabsController.js

(function() { 
    var injectParams = ['$location', '$routeParams', '$scope', '$rootScope', '$interval', 'teleAiDiagnosticsConfig']; 

    var TabsController = function ($location, $routeParams, $scope, $rootScope, $interval, teleAiDiagnosticsConfig) { 
     var vm = this; 

     $rootScope.autoNavInterval = {}; 
     $rootScope.AutoNavActive = false; 

     $scope.tabs = [ 
      { link: '#!/vehicles', refLink: '/vehicles', label: 'Vehicles', active: (($location.$$url.indexOf('/vehicle') !== -1) ? true : false) }, 
      { link: '#!/workzones', refLink: '/workzones', label: 'Workzones', active: (($location.$$url.indexOf('/workzone') !== -1) ? true : false) }, 
      { link: '#!/operatorStations', refLink: '/operatorStations', label: 'Operator Stations', active: (($location.$$url.indexOf('/operatorStation') !== -1) ? true : false) }, 
      { link: '#!/sessionStatus/123', refLink: '/sessionStatus/123', label: 'Session Status (123)', active: (($location.$$url.indexOf('/sessionStatus') !== -1) ? true : false) } 
     ]; 

     // find the tab that should be marked as active 
     for (var i = 0; i < $scope.tabs.length; i++) { 
      if ($scope.tabs[i].active == true) { 
       $scope.selectedTab = $scope.tabs[i]; 
       break; 
      } 
     } 

     if ($scope.selectedTab == undefined) 
      $scope.selectedTab = $scope.tabs[0]; 

     $scope.setSelectedTab = function (tab) { 
      $scope.selectedTab = tab; 
     } 

     $scope.tabClass = function (tab) { 
      if ($scope.selectedTab == tab) { 
       return "active"; 
      } else { 
       return ""; 
      } 
     } 

     $scope.nextTab = function() { 
      for (var i = 0; i < $scope.tabs.length; i++) { 
       if ($scope.tabs[i] == $scope.selectedTab) { 
        if (i == $scope.tabs.length - 1) { 

         $location.path($scope.tabs[0].refLink); 
         $location.replace(); 
         if (!$scope.$$phase) $scope.$apply() 

         $scope.tabs[0].active = true; 
         $scope.selectedTab = $scope.tabs[0]; 
         break; 
        } 

        else { 

         $location.path($scope.tabs[i + 1].refLink); 
         $location.replace(); 
         if (!$scope.$$phase) $scope.$apply() 

         $scope.tabs[i + 1].active = true; 
         $scope.selectedTab = $scope.tabs[i + 1]; 
         break; 
        } 
       } 
      } 
     } 

     $scope.startAutoNav = function() { 
      $rootScope.AutoNavActive = true; 
      $rootScope.autoNavInterval = $interval(function() { 
       $scope.nextTab(); 
      }, teleAiDiagnosticsConfig.autoNavTimer); 
     } 

     $scope.stopAutoNav = function() { 
      $rootScope.AutoNavActive = false; 
      $interval.cancel($rootScope.autoNavInterval); 
     } 

     $scope.startAutoNav(); 
    }; 

    TabsController.$inject = injectParams; 

    angular.module('teleAiDiagnostics').controller('TabsController', TabsController); 
}()); 

が、これは誰かに役立ちます願っています。