PHP Rocks
EventEmitter.once is fired twice - Druckversion

+- PHP Rocks (https://www.php-rocks.de)
+-- Forum: HTML, CSS, Usability und Barrierefreiheit (https://www.php-rocks.de/https://www.php-rocks.de/forum/11-html-css-usability-und-barrierefreiheit.html)
+--- Forum: JavaScript / JavaScript Frameworks / Ajax (https://www.php-rocks.de/https://www.php-rocks.de/forum/13-javascript-javascript-frameworks-ajax.html)
+--- Thema: EventEmitter.once is fired twice (/https://www.php-rocks.de/thema/109-eventemitteronce-is-fired-twice.html)



EventEmitter.once is fired twice - Till - 22.08.2016

Hallo,
Auszug aus meinem EventEmitter:
Code:
EventEmitter.prototype.once = function (event, listener) {
    this.on(event, function g () {
        this.removeListener(event, g);
        listener.apply(this, arguments);
    });
  };

und app.js...
Code:
var BootConfigLoadEvent = new EventEmitter();
          
        
        BootConfigLoadEvent.once('bootconfig', function(){
               var c = arguments[0].config;
               var themes = frdl.SQL
                                .from(c.themes)
                                .where("$.enabled == true")
                                .toArray();
                               
               frdl.each(themes, function(i,theme){
                   $('div[data-webkit-mod="themes"]').append(
                      '<div data-frdl-component="'+theme.url+'"></div>'
                   );
               });      
               webfan.$Async(function(){  
                  gui.ready.emit('theme loaded', $scope);
               },1000);
               
             
              webfan.$Async(function(){          
               var components = frdl.SQL
                                .from(c.components)
                                .where("$.enabled == true")
                                .toArray();
                               
               frdl.each(components, function(i,component){
                   $('div[data-webkit-mod="components"]').append(
                      '<div data-frdl-component="'+component.url+'"></div>'
                   );
               });    
              },1);  
               
                 
             webfan.$Async(function(){          
               var desktopwidgets = frdl.SQL
                                .from(c.desktopwidgets)
                                .where("$.enabled == true")
                                .toArray();
                               
               frdl.each(desktopwidgets, function(i,component){
                   $('div[data-webkit-mod="components"]').append(
                      '<div data-frdl-desktop-widget="'+component.url+'"></div>'
                   );
               });  
              },1);  
               
                                         
       });

...und...
Code:
var b = function(){
            
                        BootConfigLoadEvent.emit('bootconfig', {
                            config : $scope.manifest,
                            time : new Date().getTime()
                        });    
                        
            b = function(){};
                                
        };

Die Funktion welche in .once oben deklariert ist wird mehr als einmal ausgeführt.
Wie kann das sein?
Ich "lösche" wie im Code zu sehen sogar den Wrapper b(), trotzdem wird das ganze mehrmals ausgeführt, nämlich immer dann wenn sich der state (angularJS ui.router) ändert (das ganze befindet sich in einer angular config function)!?


RE: EventEmitter.once is fired twice - Till - 22.08.2016

Mh...
Im settings html template wurde der SettingsController über das template html erzeugt.
Ich habe nun dies aus dem settings template entfernt und den controller um den view gewrappt:
Code:
<div ng-controller="settingsCtrl as settingsCtrlInstance" ng-cloack>

<div ng-controller="browserCtrl as browserCtrlInstance" class="view-screen">
              
     <div ui-view="startView" data-flow-mod="tab" autoscroll></div>
     <div ui-view="internalView" data-flow-mod="tab" autoscroll></div>

    
     <div ui-view="installView" data-flow-mod="tab" autoscroll></div>
     <div ui-view="installSubView" data-flow-mod="tab" autoscroll></div>
  
</div>

</div>
Die scheint zwar das Problem zu beheben, überzeugt mich aber nicht so ganz, weil hier ein Controller um seinen html state view gewrappt ist?