У меня есть контроллер входа
myApp.controller('LoginCtrl', ['$scope', '$http','$location', function($scope, $http, $location) {
$scope.login = function() {
var data = JSON.stringify({user: $scope.user.id, password: $scope.user.password, type: "m.login.password"});
$http.post("http://localhost:8008/_matrix/client/api/v1/login", data).then(function mySuccess(details){
$http.post('/login',details.data).success(function(response){
console.log(response);
});
$location.path('home');
}, function myError(err) {
console.log(err);
alert("Invalid username/password")
});
};
}]);
и домашний контроллер
myApp.controller('HomeCtrl', ['$scope', '$http','$location', function($scope, $http, $location) {
console.log("Hello World from home controller");
var refresh = function() {
$http.get('/roomNames').success(function(response) {
console.log("I got the data I requested");
$scope.roomNames = response;
});
}
refresh();
}]);
Как видно, если данные для входа верны, LoginCtrl изменяет маршрут на home.html.
Однако, когда я запускаю приложение и логин успешно, HomeCtrl должен сделать запрос получения на сервер для данных для зарегистрированного пользователя.
Я хочу, чтобы эти данные загружались как список в home.html. Здесь мой home.html
<h3 class="subHeader"> Rooms </h3>
<ul class="nav nav-sidebar">
<!-- <li class="active"><a href="#">Overview <span class="sr-only">(current)</span></a></li> -->
<li ng-repeat="room in roomNames"><a>{{room}}</a></li>
</ul>
Однако при успешном входе в систему переменная roomNames сначала пуста. Как только я обновляю страницу, список html заполняется.
Как обеспечить, чтобы список был заполнен, как только откроется страница home.html?
Это связано с тем, что вы переходите на домашнюю страницу до доступа к вашему серверу. Поэтому на домашней странице вы не получите данные и получите их после обновления.
Переадресовываться на страницу только после успешной проверки подлинности.
myApp.controller('LoginCtrl', ['$scope', '$http','$location', function($scope, $http, $location) {
$scope.login = function() {
var data = JSON.stringify({user: $scope.user.id, password: $scope.user.password, type: "m.login.password"});
$http.post("http://localhost:8008/_matrix/client/api/v1/login", data).then(function mySuccess(details){
$http.post('/login',details.data).success(function(response){
console.log(response);
$location.path('home'); // Redirect after success login
})
.catch(function(data){
console.error("Error in login",data);
});
}, function myError(err) {
console.log(err);
alert("Invalid username/password")
});
};
}]);
roomNames
.
попробуйте использовать успешные и errorcallbacks от $ http, было бы лучше разместить эту функциональность на фабрике
myApp.controller('HomeCtrl', ['$scope', '$http', '$location',
function($scope, $http, $location) {
console.log("Hello World from home controller");
var refresh = function() {
$http.get('/roomNames')
.then(function successCallback(response) {
$scope.roomNames = response;
}, function errorCallback(response) {
//output an error if failed?
});
}
refresh();
}
]);