【问题标题】:AngularJS + Ionic - how to call method on the second controller from first controller with deffer promise?AngularJS + Ionic - 如何使用延迟承诺从第一个控制器调用第二个控制器上的方法?
【发布时间】:2014-12-09 14:40:56
【问题描述】:

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

【问题讨论】:

  • 你能把第一个和第二个控制器的代码发布在html中吗?
  • 我刚刚更新了我的问题。
  • getUserSettings() 属于第二个控制器作用域?
  • 是的 getUserSettings 在第二个控制器内部。

标签: javascript angularjs angular-promise rootscope emit


【解决方案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!" });
    });

});

希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 不幸的是,对我来说只工作 $broadcast,而不是 $scope.on 没有抛出错误或异常,所以我不知道我能做错什么。
    【解决方案3】:

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

    $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();
    });
    

    这是一个正常工作的插件:http://plnkr.co/edit/PrD3vB80lFSt0a9WQLJ9?p=preview

    【讨论】:

    • 不幸的是,对我来说只工作 $broadcast,而不是 $scope.on 没有抛出错误或异常,所以我不知道我能做错什么。
    • 我不明白你的评论,什么不起作用,什么是?
    • @redrom 如果您发布所有 Angular 代码,那么我可以看看有什么不工作!
    • 谢谢。我刚刚将问题更新为控制器和模板视图中的真实代码。
    • 好吧,您需要实际执行我建议的操作才能使其正常工作。您使用的是 $emit 而不是 $rootScope.$broadcast
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多