【问题标题】:AngularJS with ui.router: reload page when clicking the same state link带有ui.router的AngularJS:单击相同状态链接时重新加载页面
【发布时间】:2015-12-22 12:42:54
【问题描述】:

我刚收到我们的 QA 团队的请求,我认为这听起来很荒谬。在这里:假设您已经在基于角度的应用程序中的“关于”状态/页面上,并且当您再次从顶部菜单中单击“关于”状态 url 时,您希望“关于”页面重新加载。 about 页面不会从任何地方获取数据,顺便说一下,重新加载就相当于眨眼。

对于我的 Angular 应用程序中的状态配置是这样的:

.state('about', {
  url: '/about',
  templateUrl: '/path/to/about.html',
  controller: 'aboutCtrl as aboutView'
});

在顶部菜单中,我们有一个指向这个状态的链接:

<a ui-sref="about">About</a>

我已经尝试了很多方法来让它工作:点击链接会触发相同状态的重新加载。

$state.go('about', {}, {reload: true});$state.transitionTo('about', {}, {reload: true}); 之类的东西不起作用,因为链接是静态的。

我目前正在尝试的最后一个方法是通过侦听'$stateChangeSuccess' 事件来操纵 Angular 的run 阶段中​​的重新加载事情,但我认为它不会起作用,因为如果当您处于该状态时,您点击'about' 链接。

有没有办法解决这个问题?谢谢

【问题讨论】:

  • 我不认为重新加载 about 页面(我假设它是静态的)是一个好方法,原因有几个 - 你的应用程序应该只向用户表明他们已经在那个页面上。一个很好的例子是 Material Design 的动画,当你反复点击同一个标签时 - material.angularjs.org/latest/#/demo/material.components.tabs
  • 或我一直在考虑的另一种策略是当用户已经处于该状态时使该链接不可点击(不是超链接),因此这将迫使用户刷新浏览器,但我真的不想在我的控制器中引入不必要的逻辑。

标签: javascript html angularjs angular-ui-router reload


【解决方案1】:

UI 路由器附带了一个名为 ui-sref-opts 的选项属性。我遇到了同样的问题,它解决了。

例如:&lt;a ui-sref="home" ui-sref-opts="{reload: true}"&gt;Home&lt;/a&gt;

文档网址:UI Router DOcs

【讨论】:

    【解决方案2】:

    你是对的,我无法让任何state change events 在已经处于该状态时触发。直到,如果有一天该功能可以通过该 api 使用,这里有一个半hacky 的解决方案。我们可以利用ng-click 并使用一些愚蠢的逻辑来安抚QA(在你的情况下)。另外,我不知道您的控制器实现,因此为了简单性和可见性,我将我的建议放在了 $rootScope 中的 .run 中,但如果您选择这样做,请进行相应的集成。观察下面的例子……

    <a ui-sref="about" ng-click="sillyQA()">About</a>
    

    .run(['$rootScope', '$state', function($rootScope, $state) {
    
        $rootScope.sillyQA = function() {
            if($state.current.name === 'about') {
                $state.go('about', {}, { reload: true });
            }
        }
    
        // -- just to see our about => about state 'change'
        $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){
            console.log('toState:   ' + toState.name );
            console.log('fromState: ' + (fromState.name || 'Just got there! click again!'));
        })
    }]);
    

    JSFiddle Link - 演示

    【讨论】:

    • 谢谢,解释得很好!当我收到 QA 的请求时,我更生气了。因为如果需要重新加载,用户可以随时刷新浏览器窗口。我没有看到再次单击相同链接以重新加载它的意义。哈哈
    • @TonyGW 我听说你来自哪里!我只能想象有一个持续不断的提要的情况,例如关于 SO 的最新问题。如果我想“刷新”我的提要,而不是明确刷新我的浏览器,我可以整天点击该徽标。无论哪种方式,编码都很愉快,我很高兴这能够提供帮助:)
    • 实际上,该页面包含一个仅供用户输入的表单。它不会从任何地方接收任何数据。质量检查人员有时让我发疯......
    • 老实说,我不认为这应该是一个可接受的答案,因为当您处于该状态时,状态更改事件没有触发是有充分理由的(例如,单页背后的基本内容之一应用程序)。这在 AngularJS/ui-router 中也是非常糟糕的做法,因为您正在向控制器添加不必要的逻辑开销,或者在最坏的情况下 $rootScope
    • 感谢您的意见。我想我已经很明显 $rootScope 只是为了简单的演示和“相应地实现”,因为 OP 没有共享任何控制器逻辑。此外,如果您阅读了这个问题,这不是关于最佳实践,而是关于解决给定要求的独特情况。如果您认为这不应该是公认的答案,请随时发布您自己的答案。启发我们。
    猜你喜欢
    • 2014-02-11
    • 2015-06-09
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    相关资源
    最近更新 更多