当ui-sref状态改变时,控制器不会刷新。
当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
问题出现的原因是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