单击链接两次时,"ui-sref"不会刷新"ui-view"(其控制器不会重新运行)

ank*_*usu 25 angularjs angular-ui angular-ui-router

首先单击状态时,拥有"ui-view"属性的div将替换为该状态的"模板".但是,当我再次单击相同的状态时,其控制器不会重新加载.如何让此控制器再次加载?

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

<nav> 
    <a ui-sref="state1">State 1</a>
    <a ui-sref="state2">State 2</a>
</nav>
Run Code Online (Sandbox Code Playgroud)

我的"ui-view"内容如下:

<div ui-view></div>
Run Code Online (Sandbox Code Playgroud)

我的州描述如下.当我点击导航菜单上的"状态1",我希望看到的文本"Ctrl 1 loaded"developer console.如果这是第一次,那么我会观察那个文字.但是,当我重新单击相同的链接时,控制器没有再次加载,我无法看到"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"
      });
});
Run Code Online (Sandbox Code Playgroud)

为什么?你有什么主意吗?

这是这个问题的JSFiddle.

sch*_*kam 86

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

<a ui-sref="state1" ui-sref-opts="{reload: true}">State 1</a>
Run Code Online (Sandbox Code Playgroud)

在这里找到这个提示:

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

希望它可以帮助

  • ui-sref-opts ="{reload:true}"对我来说也不起作用,也没有重新加载控制器. (3认同)
  • 我怎么能在整个申请过程中这样做? (2认同)

Ric*_*ick 14

替代语法将转到不同的视图

<a ui-sref="state1({reload: true})">State 1</a>
Run Code Online (Sandbox Code Playgroud)

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

$state.go('state1', {}, {reload: true});
Run Code Online (Sandbox Code Playgroud)

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

  • `ui-sref-opts`对我不起作用.这样做了. (3认同)
  • 对于我来说,另外一种方式是随机的,`ui-sref-opts`可以工作但是将`reload:true`传递给`ui-sref`中的状态不行!有这个问题的其他人我建议尝试. (3认同)

Phi*_*ret 3

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

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

如果您想在视图更改时运行功能,您可以监听事件,甚至在元素ng-click上放置一个a