如何让我的角度控制器重新加载数据

时间:2015-08-14 10:00:49

标签: javascript angularjs

我有一个有三个视图的角度应用程序。加载时,它会运行一些代码来填充$ scope变量。当我更改视图然后返回控制器时,我希望初始代码再次运行,但它不会。它似乎是缓存的,$ scope变量不会根据发生的事情进行更新。

每次加载视图时,如何强制控制器运行初始化代码?

我的路线:

app.config(function ($routeProvider) {
  $routeProvider
    .when('/', {
        controller: 'HomeController',
        templateUrl: 'home.html'
    })
    .when('/teach', {
      controller: 'TeachController',
      templateUrl: 'teach.html'
    })
    .otherwise({
        redirectTo: '/'
    });
});

我每次想要运行的代码' /'点击路线:

getSubPools.success(function(data) {
  $scope.userPools = data;
});

控制器完整:

app.controller('HomeController', ['$scope', '$filter', 'stream', 'removeDroplet', 'qrecords', 'helps', 'get_user', 'updateRecords', 'getSubPools', function($scope, $filter, stream, removeDroplet, qrecords, helps, get_user, updateRecords, getSubPools) {

  get_user.success(function(data) { //get current user
    $scope.user = data;
  });

  getSubPools.success(function(data) {
    $scope.userPools = data;
  });

  stream.success(function(data) {
    $scope.stream = data;
    if ($scope.stream.length === 0) { //determine if user has stream
      $scope.noStream = true;
    } else {
      $scope.noStream = false;
    }
    $scope.getNumberReady(); //determine if any droplets are ready
    if ($scope.numberReady === 0){
      $scope.noneReady = true;
    } else {
      $scope.noneReady = false;
      $scope.stream = $filter('orderBy')($scope.stream, 'next_ready'); //orders droplets by next ready
    }
  });

    $scope.showEditStream = true;
    $scope.showStream = false;
    $scope.rightAnswer = false;
    $scope.wrongAnswer = true;
    $scope.noneReady = false;
    $scope.subbedDroplets = [];
    $scope.focusInput = false;

}]);

3 个答案:

答案 0 :(得分:2)

您可以使用$ routeChangeStart和$ routeChangeSuccess事件将数据重新加载到控制器中:

https://docs.angularjs.org/api/ngRoute/service/$route

编辑: 正如mohan所说,因为这将适用于每一次路线变更,你可以提供服务来捕捉这些事件,并为每条路线播放特殊事件。

并在相关的控制器/服务中监听此事件并重新加载数据

答案 1 :(得分:1)

如果要强制重新加载,请添加如下的单击功能

注意:仅当您使用$ stateProvider

时才会有效
<a href="" ng-click="goToHome()">Home</a>

并在控制器中,

$scope.goToHome = function(){
    $state.transitionTo('home', {}, {reload:true});
}

答案 2 :(得分:0)

此处的问题是点击指向&#39; /&#39;的链接并非所有初始化代码都重新运行。而不是调用数据库来获取新数据,而是只返回旧数据。我解决这个问题的方法是重写我的工厂。失败的工厂写道:

app.factory('stream', ['$http', function($http) {
  return $http.get('/stream/')
  .success(function(data) {
    return data;
  })
  .error(function(err) {
    return err;
  });
}]);

每次都工作的工厂写道:

app.factory('stream', ['$http', function($http) {
  return {
    fetch: function () {
      return $http.get('/stream/');
    }
  }
}]);

现在每次都会运行。我不知道为什么会这样。