AngularJS + Ionic - 如何从第一个控制器调用第二个控制器上的方法并具有deffer承诺?

时间:2014-12-09 14:40:56

标签: javascript angularjs angular-promise rootscope emit

我需要在第一个控制器的方法中从第二个cotroller调用初始化用户设置值(设置为rootscope)的方法。

将值成功设置为rootscope返回前提后,继续执行第一个控制器的第二个方法。

我尝试使用发射和广播示例,但没有运气。

有人可以给我一个如何正确操作的建议吗?

我在Angular 1.2和Ionic 1,beta 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();
    });

3 个答案:

答案 0 :(得分:1)

在离子模式下,在控制器视图加载之前无法调用控制器功能。如果已加载第二个控制器的视图,则可以执行以下操作:

<强> secondview.html:

设置ion-content id以获取控制器范围

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

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

第二控制器:

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!" });
    });

});

希望这有帮助。

答案 1 :(得分:0)

要实现此目的,您实际上不需要使用$rootScope(但您可以),$broadcast将在当前和所有子范围内调用观察者事件,因此父控制器中的此代码:< / p>

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

将触发当前和所有子控制器中的所有$scope.$on('onSomething', ..)回调。

这是一个带有工作示例的代码(文本'收到的事件'将在渲染的html中出现5s之后)。

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

答案 2 :(得分:0)

我确实刚刚做了一些事件发射。这是一种痛苦,但现在已经很低了:

$scope.$broadcast

这将在子范围内发出事件

Angular Doc定义:

  

将事件名称向下调度到所有子范围(及其子级)


$scope.$emit

这将发出直到父作用域

的事件

Angular 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范围层次结构,因为 - 顾名思义 - 它是根范围。因此,现在您不必担心是使用$emit还是$broadcast,因为使用$scope表示它始终是$rootScope的孩子。


所以在你的情况下,这很容易。第一个控制器应注入$rootScope并使用$broadcast。第二个控制器应该$scope并使用$on,如下所示:

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

这是一个工作的掠夺者:http://plnkr.co/edit/PrD3vB80lFSt0a9WQLJ9?p=preview