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



当一个状态被第一次点击时,拥有"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"
      });
});

为什么?你知道吗?

就像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

希望能有所帮助

切换到另一个视图的另一种语法是

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

在控制器上看起来是这样的。

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

注:$state的第二个参数。go是$ statparams。

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

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

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

只需使用下面的代码

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

最新更新