У меня есть ситуация, когда мне нужно, чтобы часть кода выполнялась только один раз в начале углового приложения. Мое приложение ищет маяк, используя плагин cordova, и, если он его найдет, приложение перенаправляется в другое состояние, иначе оно останется в состоянии home/splash
.
В настоящее время у меня этот код работает в "домашнем" контроллере, и он работает, но я надеялся на более элегантное решение. Я контролирую изменение состояния, используя простой оператор if/else
и переменную в области $scope
.
Здесь мой контроллер:
homeCtrl.$inject = ['$scope', '$state', '$rootScope', '$ionicPlatform', '$cordovaBeacon'];
function homeCtrl($scope, $state, $rootScope, $ionicPlatform, $cordovaBeacon) {
$scope.skip = false;
$ionicPlatform.ready(function() {
$cordovaBeacon.requestWhenInUseAuthorization();
$rootScope.$on("$cordovaBeacon:didRangeBeaconsInRegion", function(event, pluginResult) {
if (!$scope.skip) {
$scope.skip = true;
$state.go('app.beacon');
}
});
$cordovaBeacon.startRangingBeaconsInRegion($cordovaBeacon.createBeaconRegion("abcdefg", "8484848484848484848"));
});
}
Заранее спасибо за помощь.
Использовать Run
app.run(function('$scope', '$state', '$rootScope', '$ionicPlatform', '$cordovaBeacon'){
function homeCtrl($scope, $state, $rootScope, $ionicPlatform, $cordovaBeacon) {
$scope.skip = false;
$ionicPlatform.ready(function() {
$cordovaBeacon.requestWhenInUseAuthorization();
$rootScope.$on("$cordovaBeacon:didRangeBeaconsInRegion", function(event, pluginResult) {
if (!$scope.skip) {
$scope.skip = true;
$state.go('app.beacon');
}
});
$cordovaBeacon.startRangingBeaconsInRegion($cordovaBeacon.createBeaconRegion("abcdefg", "8484848484848484848"));
});
Запуск будет выполнен первым, прежде чем какой-либо контроллер будет загружен или какая-либо услуга будет введена.
ngInit - это то, что вам нужно в вашем случае
Если вы определяете app
или controller
вы можете указать способ, который вы хотите выполнить в начале вашего приложения, только один раз в атрибуте ng-init
.
<!DOCTYPE html>
<html>
<script src="/angular.min.js"></script>
<body>
<div ng-app="" ng-init="myText='Hello World!'">
<h1>{{myText}}</h1>
<p>The ng-init directive has created an AngularJS variable, which you can use in the application.</p>
</div>
</body>
</html>
Однако в угловых документах строго указано, что вы не должны использовать ngInit
для целей инициализации. (см. документы)
Эту директиву можно злоупотреблять, чтобы добавить ненужные суммы логики в ваши шаблоны. Существует только несколько подходящих применений ngInit, например, для наложения специальных свойств ngRepeat, как показано в демонстрации ниже; и для ввода данных через серверные скрипты. Помимо этих нескольких случаев, вы должны использовать контроллеры вместо ngInit для инициализации значений в области.
Инициализация значений - это то, что должно быть сделано от контроллера. (см. документы)
Используйте контроллеры для:
Задайте начальное состояние объекта $ scope. Добавить поведение объекта $ scope.
ng-init
предназначен для использования ... документы ясно об этом. Зачем вам нужен вид, чтобы управлять этим в первую очередь?