В ответах выше, включая GitHub, были некоторые проблемы для моего сценария, а также кнопка «Назад» или «Прямое изменение URL» из браузера - это перезагрузка контроллера, что мне не понравилось. Наконец я пошел со следующим подходом:
1. Определите свойство в определениях маршрутов, называемое noReload, для тех маршрутов, где вы не хотите, чтобы контроллер перезагружался при изменении маршрута.
.when('/:param1/:param2?/:param3?', {
templateUrl: 'home.html',
controller: 'HomeController',
controllerAs: 'vm',
noReload: true
})
2. В функции запуска вашего модуля поместите логику, которая проверяет эти маршруты. Это предотвратит перезагрузку, только если noReload
- true
, а предыдущий маршрут - тот же.
fooRun.$inject = ['$rootScope', '$route', '$routeParams'];
function fooRun($rootScope, $route, $routeParams) {
$rootScope.$on('$routeChangeStart', function (event, nextRoute, lastRoute) {
if (lastRoute && nextRoute.noReload
&& lastRoute.controller === nextRoute.controller) {
var un = $rootScope.$on('$locationChangeSuccess', function () {
un();
// Broadcast routeUpdate if params changed. Also update
// $routeParams accordingly
if (!angular.equals($route.current.params, lastRoute.params)) {
lastRoute.params = nextRoute.params;
angular.copy(lastRoute.params, $routeParams);
$rootScope.$broadcast('$routeUpdate', lastRoute);
}
// Prevent reload of controller by setting current
// route to the previous one.
$route.current = lastRoute;
});
}
});
}
3. Наконец, в контроллере слушайте событие $ routeUpdate, чтобы вы могли делать все, что вам нужно, когда изменяются параметры маршрута.
HomeController.$inject = ['$scope', '$routeParams'];
function HomeController($scope, $routeParams) {
//(...)
$scope.$on("$routeUpdate", function handler(route) {
// Do whatever you need to do with new $routeParams
// You can also access the route from the parameter passed
// to the event
});
//(...)
}
Имейте в виду, что при таком подходе вы не меняете вещи в контроллер, а затем обновить путь соответственно. Это наоборот. Сначала вы меняете путь, затем слушаете событие $ routeUpdate, чтобы изменить ситуацию в контроллере, когда изменяются параметры маршрута.
Это упрощает и согласовывает действия, поскольку вы можете использовать ту же логику, когда вы просто изменяете путь ( но без дорогостоящих $ http-запросов, если хотите) и когда вы полностью перезагрузите браузер.
Вы можете использовать такие инструменты, как Phusion Passenger , чтобы сделать ваше приложение отказоустойчивым. В случае сбоя приложения Passenger перезапускает его немедленно.
Некоторые ресурсы по этому вопросу:
https://github.com/phusion/passenger/wiki/Phusion-Passenger:-Meteor-tutorial
[113 ] https://www.phusionpassenger.com/docs/tutorials/installation/meteor/
Или используйте некоторую оркестровку контейнера и сделайте свое приложение доступным более чем на одной машине. В случае сбоя одного экземпляра ваше приложение все равно должно быть доступно.
В обоих случаях: установите ваш mongodb на отдельном сервере . Именно поэтому вам необходимо определить переменную среды MONGO_URL
в вашем развертывании Meteor, чтобы процесс вашего приложения был отделен от процесса базы данных.
В такой конфигурации вам не нужно будет «отправлять» данные о сбое на отдельный сервер, что, я думаю, может даже не быть реалистичным подходом в производственной среде.