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

时间:2014-08-06 08:30:39

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

首先点击一个州,拥有" ui-view"属性被替换为"模板"那个州。但是,当我再次单击相同的状态时,其控制器不会重新加载。如何让这个控制器再次加载?

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

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

我&#34; ui-view&#34;内容如下:

<div ui-view></div>

我的州描述如下。当我点击&#34; State1&#34;在导航菜单上,我希望观察"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"
      });
});

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

Here is the JSFiddle这个问题。

4 个答案:

答案 0 :(得分:83)

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

希望它可以提供帮助

答案 1 :(得分:12)

转到不同视图的替代语法

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

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

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

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

答案 2 :(得分:3)

因为这是ui-router的设计方式。

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

如果您希望在视图发生变化时运行功能,则可以listen for events,或者甚至在ng-click元素上添加a

答案 3 :(得分:1)

只需使用以下代码

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