我有一个有三个视图的角度应用程序。加载时,它会运行一些代码来填充$ 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;
}]);
答案 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/');
}
}
}]);
现在每次都会运行。我不知道为什么会这样。