0

我需要在第一个控制器的方法中从第二个控制器调用初始化用户设置值(设置为 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();
    });
4

3 回答 3

1

在 ionic 中,不能在控制器视图加载之前调用控制器函数。如果您的第二个控制器的视图已加载,您可以这样做:

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

});

希望这可以帮助。

于 2015-11-12T12:59:25.887 回答
0

为了实现这一点,您实际上并不需要使用$rootScope(但您可以),$broadcast将在当前和所有子范围内为事件调用观察者,因此父控制器中的这段代码:

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

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

这是一个带有工作示例的代码引脚(文本“收到的事件”将在 5 秒后出现在呈现的 html 中)。

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

于 2014-12-09T15:23:22.117 回答
0

我实际上刚刚完成了一些事件发射。这是一种痛苦,但这里很低:

$scope.$broadcast

这将在子范围内发出事件

Angular 文档定义:

向下分派事件名称到所有子作用域(及其子作用域)


$scope.$emit

这将向父范围发出事件

Angular 文档定义:

通过范围层次结构向上调度事件名称


我和我的同事认为这是最好的方法。但我也相信这是最可靠的:

在调度事件的控制器/服务中注入$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();
});

这是一个工作 plunker:http ://plnkr.co/edit/PrD3vB80lFSt0a9WQLJ9?p=preview

于 2014-12-09T15:31:43.643 回答