如何防止兄弟状态控制器刷新?

时间:2017-02-20 20:33:57

标签: javascript angularjs angular-ui-router

https://plnkr.co/edit/zfmuZXp88cSbdOsibv3y?p=preview

我有一个主dashboard个父州,有两个子州tagstickers

当我点击tickers中的按钮时,只有tags状态应该刷新。目前他们都刷新了。

enter image description here

enter image description here

^ onInit tickersController console.log应该只运行一次。但是,每次单击自动收报机时都应运行tagsController。

var routerApp = angular.module('routerApp', ['ui.router']);

routerApp.config(function($stateProvider, $urlRouterProvider) {

    $urlRouterProvider.otherwise('/dash');

    var dash = {
      name: 'dash',
      url: '/dash?ticker',
      params: {
        ticker: 'AAA'
      },
      views: {
        '': { templateUrl: 'dashboard.html' },
        'tagsList@dash': {
          url: '/tags',
          templateUrl: 'tags-list.html',
          controller: 'tagsController'
        },
        'tickersList@dash': {
          url: '/tickers',
          templateUrl: 'tickers-list.html',
          controller: 'tickersController'
        },
        'alertsList@dash': {
          url: '/alerts',
          templateUrl: 'alerts-list.html',
          controller: 'alertsController'
        }
      }
    };

    $stateProvider
      .state(dash);            
});

routerApp.controller('tagsController', function($scope, $state) {
    $scope.ticker = $state.params.ticker;

    function getList(ticker) {
      switch(ticker) {
          case 'AAA' : return ['aaa tag 1', 'aaa tag 2', 'aaa tag 3'];
          case 'BBB' : return ['bbb tag 1', 'bbb tag 2', 'bbb tag 3'];
          case 'CCC' : return ['ccc tag 1', 'ccc tag 2', 'ccc tag 3'];
      } 
    }

    $scope.tags = getList($state.params.ticker);

    this.$onInit = function() {
      console.log('onInit tagsController');
    };
});

routerApp.controller('tickersController', function($scope, $state) {
    $scope.changeScotchState = function(theTicker) {
        $state.go('dash', { ticker: theTicker });
    };

    $scope.tickers = [
      'AAA', 'BBB', 'CCC'
    ];

    this.$onInit = function() {
      console.log('onInit tickersController', $state.params.ticker);
    };
});

routerApp.controller('alertsController', function($scope, $state) {

    this.$onInit = function() {
      console.log('onInit alertsController', $state.params.ticker);
    };

});

2 个答案:

答案 0 :(得分:1)

https://plnkr.co/edit/iramGsSrJ2vKYvDPWFTb?p=preview

如果不将视图移动到其中一个父状态,则无法保持视图不刷新。这是应该有效的改变状态

    var tags = {
      name: 'dash.tags',
      url: '?ticker',
      views: {
        'tagsList@dash': {
          templateUrl: 'tags-list.html',
          controller: 'tagsController'
        }
      }
    }

var dash = {
  name: 'dash',
  url: '/dash',
  abstract: true,
  views: {
    '': { templateUrl: 'dashboard.html' },
    'tickersList@dash': {
      templateUrl: 'tickers-list.html',
      controller: 'tickersController'
    }
  }
};

答案 1 :(得分:1)

我编辑你的plunker工作没有状态刷新:

https://plnkr.co/edit/ntGVGQ06yVQC4W0Fl7A8?p=preview

广播:

    $scope.changeScotchState = function(theTicker) {
   $rootScope.$broadcast('newData',  theTicker);
};

和$ on:

   $scope.$on('newData', function(event, ticker){

      $scope.tags = getList(ticker);
      $scope.ticker = ticker;
    })

是最重要的部分和变化。