【问题标题】:How to prevent sibling state controller from refreshing?如何防止兄弟状态控制器刷新?
【发布时间】:2017-02-20 20:33:56
【问题描述】:

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

我有一个主要的 dashboard 父状态和两个子状态 tagstickers

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

^ 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);
    };

});

【问题讨论】:

  • 可能是状态变化?那么会不会影响门票查看?
  • 是的,您将如何避免更改代码视图?或者其他任何孩子。基本上,我只希望仪表板的子项在他们需要的特定状态变量发生更改时被刷新。实际上,我将继续添加第三个控制器。
  • 更新网址:'/tags',不是父视图?
  • ticker 参数在 dash 上声明。每当ticker 参数更改时,dash 状态和所有子项都会重新加载。如果可以,请将 ticker 参数移至子状态。

标签: javascript angularjs angular-ui-router


【解决方案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'
    }
  }
};

【讨论】:

  • 谢谢,但是在您的示例中,没有显示标签列表。实际上,我在这里分叉了一个新的 plnkr,每个状态对象都被分解:plnkr.co/edit/NbB98J7TwUz5SrgE5jQn?p=preview
  • 更新了 plunk。我忘了在父状态上添加abstract: true
  • 嘿,所以我尝试删除 ui-sref,所以我可以在 Javascript 中使用$state.go,但我收到错误Error: Cannot transition to abstract state 'dash',请看这里? stackoverflow.com/questions/42371668/…
  • 抽象状态的定义是不能切换到它。必须切换到对应的子状态——state.go('dash.tags', {ticker: 'something'})
【解决方案2】:

我编辑了你的 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;
    })

是最重要的部分和变化。

【讨论】:

  • 谢谢!您的代码也可以像 Stepans 一样工作……不过,我不知道您在哪里使用了上面的这些事件?
  • tickersControllertagsController 中。首先我更新了changeScotchState 函数,然后在tagsCtrl 中执行操作
  • 这两个代码都可以工作,因为方法非常不同。在构建基于组件的应用程序时,我经常使用 $broadcast 和 emit。组件不直接通信,所以它是必要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2022-01-01
  • 2021-06-01
  • 2016-03-01
相关资源
最近更新 更多