当ui-sref状态改变时,控制器不会刷新。

15 浏览
0 Comments

当ui-sref状态改变时,控制器不会刷新。

前言\n点击ui-sref链接不会刷新命名视图的控制器。\n

问题

\n当从SidePanelCtrl点击ui-sref=\"root.store.page.ad({ adSlug: promo.code })\"时,如何刷新WeeklyCtrl?\n请注意页面上会重新加载。我看到图标闪烁,但没有任何控制器的重新初始化。\nroutes.js\n

$stateProvider
  .state('root', {
    url: '/',
    abstract: true,
    views: {
      '': {
        templateUrl: 'views/main.html',
        controller: 'MainCtrl'
      }
    }
  })
  .state('root.store', {
    url: ':storeSlug',
    views: {          
      'sidepanel': {
        templateUrl: 'views/partials/side-panel.html',
        controller: 'SidePanelCtrl'
      },
      'weekly': {
        templateUrl: 'views/partials/weekly.html',
        controller: 'WeeklyCtrl'
      },
    }
  })
  .state('root.store.page', {
    url: '/page',
  })
  .state('root.store.page.ad', {
    url: '/:adSlug',
  })

\nindex.html\n


\nmain.html\n

  

\nside-panel.html\n


    

...

\n当WeeklyCtrl初始化时,它会触发一个API调用。\n

Pages.details.getPages($scope).success(function(data){
    console.log(data);
});

\n最后,当我在不同的促销活动之间切换时,我希望再次触发这个API调用。\n更新:\n点击链接后:\nAPI响应3次。控制器多次重新初始化。\n\"3

0
0 Comments

问题出现的原因是ui-router设计的如此,控制器只有在不同的状态下才会加载,即使在多个状态下使用相同的控制器并在它们之间切换,控制器也不会重新运行。

解决方法是添加一个名为"boom"的函数到控制器中,该函数用于实际刷新控制器。同时,在视图中使用ng-click指令调用"boom"函数,并在函数内部调用$state.transitionTo方法来切换状态。

如果不喜欢这种解决方法,可以根据ui-sref的源代码创建一个新的指令,命名为"ui-sref-ctrl"。

对于控制器被刷新三次的问题,可以使用Chrome调试器,在控制器初始化的位置设置断点,并查看调用堆栈,了解是谁生成了这些初始化。

参考链接:"ui-sref" does not refresh the "ui-view"(its controller does not rerun) when a link is clicked twice

0