在常规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的guid构思)
<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>
答案 0 :(得分:6)
我认为您的问题已在此帖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
});
...
});
答案 1 :(得分:0)
您可能正在导航到具有相同网址和之前加载的参数的状态。强制重新加载的一种方法是将guid作为参数传入您的状态并设置reloadOnSearch=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(如果您的版本&gt; = 0.2.5)
.state('app.game', {
url: "/x/{gameID:int}",
views: {
'menuContent': {
templateUrl: "templates/html/my-game.html",
controller: 'GameCtrl'
}
},
reload: true
})
复制了很棒的guid函数