如何在每次 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
});
...
});
在常规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 $ionicView.enter
事件运行中添加你想要的代码
controller : function( $scope, $cordovaSQLite ){
$scope.$on('$ionicView.enter', function() {
// code to run each time view is entered
});
...
});