2014-12-09 6 views
0

Мне нужно вызвать метод для инициализации значений пользовательских настроек (которые установлены на корневой каталог) из второго котроллера в методе первого контроллера.AngularJS + Ionic - как вызвать метод на втором контроллере от первого контроллера с обещанием deffer?

После того, как значения успешно установлены в корневую область возврата и продолжают выполнение второго метода первого контроллера.

Я попробовал его с использованием источников излучения и трансляции, но без везения.

Может кто-нибудь, пожалуйста, дайте мне совет, как это сделать правильно?

Я на угловых 1.2 и Ionic 1, бета 13

Большого спасибо за любую помощь.

Шаблон:

<ion-view title="{{ 'DAYS_RESULTS' | translate }}" > 
    <ion-content ng-controller="DailyStatsCtrl" ng-init="setData()"> 

Код:

// First cotroller call setData in ng-init 

angular.module('starter') 
// Controller definition 
.controller('DailyStatsCtrl', function($scope, $rootScope, $ionicSlideBoxDelegate, $timeout , $ionicLoading , $q, $translate, DialsComputeService, cordova, LocalStorService, $ionicPopup, $state, $ionicNavBarDelegate, testService, $ionicPlatform) { 


     $scope.setData = function() { 
      $ionicPlatform.ready(function() { 
       $timeout(function() { 
        $scope.$emit("onSomething", ""); 
        alert("TEST"); 
       }, 1000); 
      }); 
     }; 

Во втором контроллере:

angular.module('starter') 
// Controller definition 
.controller('SettingsCtrl', function($scope, $rootScope, $ionicLoading, $ionicPlatform, LocalStorService, $timeout, $translate, $ionicPopup, $state, $ionicNavBarDelegate) { 

    $scope.getUserSettigns = function() { 
     alert("received"); 
     $scope.test = 'event received'; 
    } 
    $scope.$on('onSomething', function(e) { 
     $scope.getUserSettigns(); 
    }); 
+0

Не могли бы вы отправить код первого и второго контроллеров и это отношения в html. – Rasalom

+0

Я только что обновил свой вопрос. – redrom

+0

и 'getUserSettings()' относится ко второй области контроллера? – Rasalom

ответ

0

для того чтобы достигнуть это вы на самом деле не нужно использовать $rootScope (но вы можете), $broadcast будет вызывать наблюдатель для события текущих и все дочерние области, так что этот код в родительском контроллере:

$scope.setData = function() { 
    $timeout(function() { 
     $scope.$broadcast("onSomething", ""); 
    }, 5000); 
    }; 

будет вызывать все $scope.$on('onSomething', ..) обратный вызов в течение и всех дочерних контроллеров.

вот код с рабочим примером (текст «полученное событие» появится после 5 секунд в отображаемом html).

http://codepen.io/anon/pen/VYeEOg

+0

К сожалению, для меня работает только $ broadcast, а не $ scope.on никакая ошибка или исключение не выбрасывается, поэтому я не знаю, что я могу сделать неправильно. – redrom

0

Я буквально только что сделал какое-то событие, испускающий.Это боль, но вот на низком уровне:

$scope.$broadcast 

Это будет испускать события вниз дети прицелов

Угловой Doc Определение:

Отправляет имя события вниз для всех дочерних областей (и их дети)


$scope.$emit 

Это будет испускать события вплоть до родительского прицелы

Угловой Doc Определение:

Отправляет имя события вверх по иерархии областей видимости


Я и мой коллега считают, что это лучший метод. Но я также считаю, что это самый надежный:

В контроллер/сервиса, который отправляется событие впрыскивать $rootScope и использовать $broadcast

.service('DispatchEvent', ['$rootScope', function ($rootScope) { 
    $rootScope.$broadcast('someEvent'); 
}]); 

На контроллере/услуге, который получает событие, впрыснуть $scope и использовать $on

.controller('ReceivingEventsController', ['$scope', function ($scope) { 
    $scope.$on('someEvent', function (e) { 
     // do something 
    }); 
}]); 

Таким образом $rootScope всегда будет $broadcast ИНГ вниз по иерархии области действия, потому что - как имя sugg ests - это корневой объем. Так что теперь вам не нужно беспокоиться о том, следует ли использовать $emit или $broadcast, потому что использование $scope означает, что он всегда будет дочерним по отношению к $rootScope.


Так что в вашем случае это легко. Первый контроллер должен иметь $rootScope и ввести $broadcast. Второй контроллер должен иметь $scope и использовать $on, и выглядеть следующим образом:

$scope.$on('onSomething', function(e) { 
    $scope.getUserSettings(); 
}); 

Вот рабочая plunker: http://plnkr.co/edit/PrD3vB80lFSt0a9WQLJ9?p=preview

+0

К сожалению, для меня работает только $ broadcast, а не $ scope.on никакая ошибка или исключение не выбрасывается, поэтому я не знаю, что я могу сделать неправильно. – redrom

+0

Я не понимаю ваш комментарий, что не работает и что такое? –

+0

@redrom, если вы разместите весь свой угловой код, тогда я могу взглянуть и посмотреть, что не работает! –

1

В ионном, функция управления не может быть вызвана до контроллера просмотрите нагрузку. Если изображение вашего второго контроллера было загружено, вы можете сделать это:

secondview.HTML:

набор ионно-идентификации контента, чтобы получить объем контроллера

<ion-view title="second"> 
    <ion-content id="secondView"> 

    </ion-content> 
</ion-view> 

Seccond Контроллер:

app.controller('SecondController', function($scope, $http) { 

    $scope.someFunction = function(args) { 
     alert(args.Message); 
    }; 

}); 

Код:

app.controller('CodeController', function($scope) { 

    $scope.$on('$ionicView.beforeEnter', function(){ 
     angular.element($('#secondView')).scope().someFunction({ Message: "Hello!" }); 
    }); 

}); 

Надежда это ч ELPS.

 Смежные вопросы

  • Нет связанных вопросов^_^