In Angular.js, scope.$on("UPDATE", function(event, account, vipLabel, 
nodeName) is firing about 20 times when it should only invokes once for 
each $rootScope.$broadcast("UPDATE", this.account,this.vipLabel, 
this.nodeName). I know that scope.$on() contains an event object, but I 
haven't been able to find a use for it to help my issue. I am really stuck 
on this and I need the scope.$on() to fire only once for each broadcast. 
Can anyone please help? I have been stuck on this for a long time and I 
really need for $scope.$on() to fire only once for each broadcast.

Note, I realize the html element directive is being applied in the html 3 
times, but the scope.$on() is firing 21 times and not 3.

Service:

angular.module('main.vips')
.factory("StatusTrackerService", function($timeout, $rootScope, 
Restangular) {
    var CHECK_ITERATIONS = 1;
    var TIME_ITERATION = 1000;
    var eventCollection = {};
    eventCollection.vipLabel;

    function urlBuilder(account, eventId) {
        var account = Restangular.one("account", account);
        var eventId = account.one("event", eventId);
        return eventId;
    }

    function NewStatusEvent(account, eventId, url, vipLabel, nodeName) {
        this.iteration = 0;
        this.account = account;
        this.eventId = eventId;
        this.url = url;
        this.vipLabel = vipLabel;
        this.nodeName = nodeName;
    }

    NewStatusEvent.prototype.runCheckLoop = function() {
        this.url.get()
        .then(function(data) {
            if (data.Automation.Status != "SUCCESS") {
            console.log("yes");
            console.log(this.iteration);
            console.log(CHECK_ITERATIONS);

                if (this.iteration < CHECK_ITERATIONS) {
                    this.iteration++;
                    $rootScope.$broadcast("UPDATE", this.account,
                        this.vipLabel, this.nodeName);
                    console.log('-------------------');
                    console.log('checking ' + JSON.stringify(this.url));
                    console.log('iteration ' + this.iteration);
                    console.log('-------------------');
                    $timeout(function (){
                        this.runCheckLoop();
                    }.bind(this), TIME_ITERATION);
                }
            }
        }.bind(this));
    }

    function runEventCheck(account, eventId, nodeName) {
        url = urlBuilder(account, eventId);

        eventCollection[eventCollection.vipLabel] = new 
NewStatusEvent(account, eventId,
                url, eventCollection.vipLabel, nodeName);
        eventCollection[eventCollection.vipLabel].runCheckLoop();
    }
    return { runEventCheck: runEventCheck,
             eventCollection: eventCollection
    };
});

Directive:
            return {
                templateUrl: "vips/directives/action_button.html",
                restrict: "AE",
                replace: true,
                transclude: false,
                scope: {
                  label: "@?",
                  icon: "@?",
                  type: "@?",
                  actions: "=?"
                },
                link: function(scope, element, attrs) {
                  element.on("click", function(event) {
                      var vipLabel = event.currentTarget.id;
                      StatusTrackerService.eventCollection.vipLabel = 
vipLabel;
                  });

                  scope.$on("UPDATE", function(event, account,
                              vipLabel, nodeName) {
                      console.log("Scope.on has fired this many times");
                      var nodeSelector = "#node-"+vipLabel+"-"+nodeName;
                      var nodeElement = 
angular.element(document.querySelector(nodeSelector));
                      if (!nodeElement.length) {
                          var vipElement = 
angular.element(document.querySelector('#vipLabel-'+vipLabel));
                          var elementGlobe = '<div 
id="'+vipLabel+nodeName+'">Element modified</div>'; 
                          vipElement.append(elementGlobe);
                      }
                  });

                  return scope.actions = services[attrs.type];
                }
              }
});

Logged output:
21 -Scope.on has fired this many times actionButton.js:52
------------------- status-checker.js:35
checking 
{"id":"0fd6afd9-2367-4a0-a5c9-ff0b3e60cdcf","route":"event","reqParams":null,"$fromServer":false,"parentResource":{"route":"account","parentResource":null,"id":"99006"},"restangularCollection":false}
 
status-checker.js:36
iteration 1 status-checker.js:37
------------------- 

Html:
<div action-button type="loadbalancer" label="Actions" icon="glyphicon 
glyphicon-cog"
       actions="actions.loadbalancer"></div>

</div>

              <div id="{{vip.label}}" action-button type="vip" 
icon="glyphicon glyphicon-pencil" actions="actions.vips"
                   class="pull-right"></div>


                      <div action-button type="node" icon="glyphicon 
glyphicon-pencil" actions="actions.nodes"
                           class="pull-right"></div>




-- 
You received this message because you are subscribed to the Google Groups 
"AngularJS" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/angular.
For more options, visit https://groups.google.com/d/optout.

Reply via email to