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

时间:2015-03-31 13:27:04

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

在常规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>

2 个答案:

答案 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
})

注意:从Create GUID / UUID in JavaScript?

复制了很棒的guid函数