如何在每次 angularjs ui-路由器命名视图被激活时 运行 控制器?

How to run controller each time angularjs ui-router named view is activated?

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

我的代码:

//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;
  }); 
})

编辑:我实际上使用此代码进入游戏视图(目前正在玩 guid 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>

您可能正在导航到具有与之前加载的相同 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
})

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

我认为你的问题已经解决了 post brandyshea说你需要在$ionicView.enter事件运行中添加你想要的代码

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

    ...
});