【问题标题】:How to run controller each time angularjs ui-router named view is activated?每次激活angularjs ui-router命名视图时如何运行控制器?
【发布时间】:2015-06-04 20:44:44
【问题描述】:

在常规 angularjs ui-router 状态下,每次激活状态时控制器都会运行。在处理离子应用程序中的命名视图时,我发现情况并非如此。命名的视图控制器每个元素(游戏)只运行一次。例如。用户显示游戏 -> 控制器运行。然后用户进入另一个状态,当他们返回显示相同的游戏控制器时不会再次运行 - 视图使用之前已经生成的范围。我想用控制器重新初始化游戏范围。

我的代码:

//app.js
.state('app.game', {
  url: "/x/{gameID:int}",
  views: {
    'menuContent': {
      templateUrl: "templates/html/my-game.html",
      controller: 'GameCtrl'
    }
  }
})

...

//controllers.js
controllers.controller('GameCtrl', function ($scope, $stateParams, Game) {
  //alert("running controller");
  Game.get({id: $stateParams.gameID}, function(res){
    $scope.game = res;
  }); 
})

编辑:我实际上使用此代码进入游戏视图(目前正在使用 Steven Wexler 的指导思想)

<ion-view view-title="Games">
  <ion-content>
    <h1>Games</h1>
    <ion-list>
    <ion-item nav-clear menu-close href="#/app/x/{{game.id}}?guid=    {{guid()}}" ng-repeat="game in games">
        {{game.id}}
    </ion-item>
    </ion-list>    
  </ion-content>
</ion-view>

【问题讨论】:

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


    【解决方案1】:

    我认为你的问题已经在这篇文章中解决了Angular / Ionic - controller only runs once brandyshea表示需要在$ionicView.enter事件中添加要运行的代码

    controller : function( $scope, $cordovaSQLite ){
        $scope.$on('$ionicView.enter', function() {
            // code to run each time view is entered
        });
    
        ...
    });
    

    【讨论】:

    • 这似乎是我正在寻找的。我会尽快更新你。
    • 记得告诉我这很好用,如果您可以将此答案标记为有用,请
    • 好的,所以另一个stackoverflow问题是关于这个问题(我的错!)。您的答案似乎是正确的,但对我来说最有效的是将“缓存:假”添加到 app.game 状态。更多来自另一个问题的文档链接。谢谢大家。
    【解决方案2】:

    您可能正在导航到具有先前加载的相同 url 和参数的状态。强制重新加载的一种方法是将 guid 作为参数传入您的状态并设置 reloadOnSearch=true(默认情况下为 true)。第二种强制重新加载的方法是使用 0.2.5 版中添加的重新加载选项。

    选项 1

    .state('app.game', {
      url: "/x/{gameID:int}/{guid}",
      views: {
        'menuContent': {
          templateUrl: "templates/html/my-game.html",
          controller: 'GameCtrl'
        }
      }
    })
    
    $state.go("app.game", { gameId: id, guid: guid }); 
    
    function guid() {
      return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
        return v.toString(16);
      });
    }
    

    选项 2(如果您的版本 >= 0.2.5)

    .state('app.game', {
      url: "/x/{gameID:int}",
      views: {
        'menuContent': {
          templateUrl: "templates/html/my-game.html",
          controller: 'GameCtrl'
        }
      },
      reload: true
    })
    

    注意:从 Create GUID / UUID in JavaScript? 复制的很棒的 guid 函数

    【讨论】:

    • 对不起,我不能投票给你,因为我的代表很低。我选择了更多离子特定的解决方案,但这个似乎质量非常好。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 2016-09-10
    相关资源
    最近更新 更多