【问题标题】:"ui-sref" does not refresh the "ui-view"(its controller does not rerun) when a link is clicked twice单击两次链接时,“ui-sref”不会刷新“ui-view”(其控制器不会重新运行)
【发布时间】:2014-09-29 02:34:50
【问题描述】:

当第一次点击一个状态时,拥有“ui-view”属性的div被替换为该状态的“模板”。但是,当我再次单击相同的状态时,它的控制器不会重新加载。我怎样才能让这个控制器再次加载?

例如,假设我有以下导航菜单:

<nav> 
    <a ui-sref="state1">State 1</a>
    <a ui-sref="state2">State 2</a>
</nav>

我的“ui-view”内容如下:

<div ui-view></div>

我的状态描述如下。当我单击导航菜单上的“State1”时,我希望在developer console 上观察到文本"Ctrl 1 loaded"。如果是第一次,那么我会观察该文本。但是,当我重新点击相同的链接时,控制器没有再次加载,即我无法在控制台上看到文本"Ctrl 1 loaded" 显示两次。

myApp.config(function ($stateProvider, $urlRouterProvider){
    $stateProvider.state("state1", {
        url: "#",
        template: "<p>State 1</p>",
        controller: "Ctrl1"
      }).state("state2", {
        url: "#",
        template: "<p>State 2</p>",
        controller: "Ctrl2"
      });
});

为什么?你有什么想法吗?

Here is the JSFiddle 这个问题。

【问题讨论】:

    标签: angularjs angular-ui angular-ui-router


    【解决方案1】:

    就像 Philipp 说的,这是因为这是 ui-router 的默认行为,但是如果您想在每次单击链接时重新加载控制器,您实际上可以使用 ui-sref-opts 属性来强制它,像这样:

    <a ui-sref="state1" ui-sref-opts="{reload: true}">State 1</a>
    

    在这里找到这个提示:

    https://github.com/angular-ui/ui-router/commit/91a568454cc600aa4f34dedc8a80c9be1130b1c5

    希望对你有帮助

    【讨论】:

    【解决方案2】:

    转到不同视图的替代语法

    <a ui-sref="state1({reload: true})">State 1</a>
    

    在控制器上它看起来像这样。

    $state.go('state1', {}, {reload: true});
    

    注意:$state.go 的第二个参数是 $stateParams。

    【讨论】:

    • 多么随机,对我来说,反过来,ui-sref-opts 有效,但将reload: true 传递到ui-sref 中的状态却不行!其他有此问题的人我建议尝试。
    • 你使用的是什么版本的角度?
    【解决方案3】:

    因为 ui-router 就是这样设计的。

    控制器仅在处于不同状态时才会加载。 ui-router 不会重新运行控制器,也不会重新评估视图模板。 即使您在多个状态下使用同一个控制器并在这些状态之间切换,控制器也不会重新运行。

    如果您想在视图更改时运行功能,您可以listen for events,甚至在您的a 元素上放置一个ng-click

    【讨论】:

    • 感谢您的回复。如何使用 ng-click 再次调用该函数?
    • @ankakusu 你可能必须在控制器中设置一个监听器并从ng-click 发出一个事件,更多的是here
    • ng-click 事件也被抑制。我将一个 ng-click 事件绑定到状态 1。即使我单击该项目,也不会触发 ng-click 事件。您可以从this CodePen查看。
    • @ankakusu Ctrl1 仅控制ui-view 下的元素,click 定义在Ctrl1 范围内的元素只有在您从视图中调用时才会被触发。 Here's a sample with a navbar controller。如果你使用这个,在$emit(点击时)和$on(在Ctrl1)的范围内发送消息,你可以在Ctrl1的范围内接收事件。
    • 创建新家 它无法正常工作。请建议我,我们应该如何改变它...
    【解决方案4】:

    只需使用下面的代码

    $stateProvider.
      state('myPage', {
        url: '/',
        cache: false // add this line
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 2014-11-21
      • 2013-10-08
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多