1

I am using two controllers. When changes happen in one controllers it should get changed immediately in the other controller. I am using the $broadcast event to achive this.

My code:

My First controller

app.controller('configurationCtrl', function($scope, $http,Notification,$rootScope,$cookies) {
$scope.awssubmit=function(){
  $scope.page_loader=true
  $http.post("/insert_config_details",$scope.userdata).then(function(List){
   if(List){
   $scope.page_loader=false;
   $cookies.put("bucket",$scope.userdata.bucket_name)
   $scope.$broadcast('eventEmitedName', 'Some data');
   Notification.success('<span class="glyphicon glyphicon-ok"></span> <strong>AWS Configuration details updated successfully.</strong>');
}
  else{
  $scope.page_loader=false;
  Notification.error('<span class="glyphicon glyphicon-ok"></span> <strong>Error!!! Please try again later.</strong>');
  }
  $scope.awssave = false;
  $scope.awstext=true;
  })
 } 
});

My Second Controller:

app.controller('SidemenuController', function($scope, $http,$location,BucketService) 
 {

      $scope.$on('eventEmitedName', function (event, data) {
         console.log("Called"); //I am not getting this 
    value
        console.log(data); // 'Some data' // I am not getting this 
    value
      });
});

aws_submit() is called from my view and everything seems to work fine. But in SidemenuController I am not getting any data. Is there any mistake in my code?

Update:

My view :

 <form id="awsform" method="post" name="awsform" class="form-horizontal" novalidate>
                    <div class="col-sm-6 four_module_config">
                      <div class="account_settings">
                        <div class="col-sm-12 heading_config" ng-hide="awssave">
                          <h4 class="sub_title col-sm-11" style="border-bottom:none">AWS S3 Configurations</h4>
                          <% if(valid_role[1]) { %>
                            <div class="action col-sm-1">
                              <span class="actico editrole" ng-click="editaws()">
                        <a href='javascript:void(0)' ></a>
                        </span>
                            </div>
                            <% } %>
                        </div>
                        <div class="col-sm-12 heading_config" ng-show="awssave">
                          <h4 class="sub_title col-sm-9" style="border-bottom:none">AWS S3 Configurations</h4>
                          <div class="action col-sm-3 close_config">
                            <button  type="button" class="site_btn submit_btn save_config col-sm-2" id="submit" ng-show="awstest"
                              ng-click="verifyaws()">Test</button>
                            <button type="button" class="site_btn submit_btn save_config col-sm-2" id="submit" ng-show="submitawssave"
                              ng-click="awssubmit()">Submit</button>
                            <button type="button" class="site_btn submit_btn save_config col-sm-2" id="submit" ng-click="closeaws()">Cancel</button>
                          </div>
                        </div>
                        <div class="ipfield  col-md-8 hint_txt_conf">
                          *Enter your AWS access Key, S3 Bucket name configured in your AWS Environment. Which is used to store your document in the
                          cloud.
                        </div>
                        <div class="ipfield first_ipfield">
                          <div class="col-md-8">
                            <label for="name" class="usrlabel">AWS access key <span class="mandat">*</span></label>
                            <input type="password" ng-disabled="awstext" ng-model="userdata.key" required name="key" class="txt_box" id="key" placeholder="Enter AWS access key">
                            <span toggle="#key" class="fa fa-fw fa-eye field_icon toggle-password"></span>
                          </div>
                        </div>
                        <div class="ipfield">
                          <div class="col-md-8">
                            <label for="name" class="usrlabel">AWS Secret Key <span class="mandat">*</span></label>
                            <input type="password" ng-disabled="awstext" ng-model="userdata.secretkey" required name="secretkey" class="txt_box" id="secretkey" placeholder="Enter AWS Secret Key">
                            <span toggle="#secretkey" class="fa fa-fw fa-eye field_icon toggle-password"></span>
                          </div>
                        </div>
                        <div class="ipfield">
                          <div class="col-md-8">
                            <label for="name" class="usrlabel">AWS Region Code <span class="mandat">*</span></label>
                            <input type="text" ng-disabled="awstext" ng-model="userdata.region" required name="region" class="txt_box" id="region" placeholder="Enter AWS Region Code">

                          </div>
                        </div>
                        <div class="ipfield">
                          <div class="col-md-8">
                            <label for="name" class="usrlabel">AWS Bucket Name <span class="mandat">*</span></label>
                            <input type="text" ng-disabled="awstext" ng-model="userdata.bucket_name" required name="bucket_name" class="txt_box" id="bucket"
                              placeholder="Enter  AWS Bucket Name">
                          </div>
                        </div>
                      </div>
                    </div>
                  </form>
5
  • Could you please add HTML code? Commented Mar 20, 2018 at 12:32
  • Updated kindly check Commented Mar 20, 2018 at 12:35
  • Not just button code. I need ng-controller directive code as well. Commented Mar 20, 2018 at 12:36
  • Check adding console.log() above $scope.$broadcast() line. Will get to know it is getting called or not. Commented Mar 20, 2018 at 12:39
  • Did ng-controller directive is present? If yes then Try @Ved solution, this could be the reason. Commented Mar 20, 2018 at 12:43

2 Answers 2

2

If you want to send data from one controller to another controller using $brodcast than use $rootscope.$broadcast

$rootScope.$broadcast('eventEmitedName', 'Some data');

Second Controller

app.controller('SidemenuController', function($scope, $http,$location,BucketService) {
    $scope.$on('eventEmitedName', function (event, data) {
        console.log("Called");
        console.log(data); // 'Some data'
        $scope.bucket = data;
    });
});

Note: Do not use $rootscope.$on as listener because $rootscope listener are not destroyed . Instead it will create listeners stack

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you its working Perfect . Am getting the value if i used for $scope.bucket = data, Its not get updating in view
1

If you want to call one controller event into another there are four methods available:

  • $rootScope.$broadcast() if your controller are not in a parent / child relation.
  • If your second controller (event fired here) is a parent you can use $scope.$broadcast();
  • If your second controller (event fired here) is a child you can use $scope.$emit();
  • The best way to solve this would be to use a service -> Example of using a service to share data between controllers.

Note: You need to destroy $rootScope.$on() listeners manually avoid stacking events. This Difference between $rootScope.$on vs $scope.$on and this Do you need to unbind $scope.$on in $scope $destroy event? will help you understand the basics of using events.

View

<div ng-controller="MyCtrl">
  <button ng-click="broadcast()">
    broadcast
  </button>
</div>
<div ng-controller="MySecondCtrl">
  {{ test }}
</div>

AngularJS application

var myApp = angular.module('myApp', []);

myApp.controller('MyCtrl', function($scope, $rootScope) {
  $scope.broadcast = function() {
    $rootScope.$broadcast('test', 'testit');
  }
});

myApp.controller('MySecondCtrl', function($scope, $rootScope) {
  var registerScope = $rootScope.$on('test', function(test, args) {
    console.log(args);
    $scope.test = args;
  });

  // clean up, destroy event when controller get destroyed. 
  $scope.$on('$destroy', registerScope);
});

> demo fiddle

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.