2015-06-15 17 views
5

Ich bin ein Neuling bei angularjs und ich erstelle eine Webanwendung, um Erfahrung und Praxis zu sammeln. Das Problem, das ich habe, ist, dass $scope.$emit scheint nicht zu funktionieren, ich bin auf der Suche nach Möglichkeiten, Funktionen zwischen den Controllern zu kontaktieren und bis jetzt habe ich im Internet gefunden, dass $scope.emit und $scope.on scheint für diese Art von Aufgabe zu passen, wenn es eine andere gibt Art und Weise, ich würde gerne wissen, sowieso der Code wird wie folgt geschrieben:

loginController.js

(function(angular) 
{ 
    var app = angular.module('Organizer'); 

    // inject $scope to the controller in order to try $scope.$emit 
    app.controller('login', function($http, $scope) 
    { 
     // i define the scope like this so i can access inside other functions 
     var scope = this; 
     scope.processing = false; 
     scope.message = null; 

     scope.submit = function() 
     { 
      scope.processing = true; 

      // store data for post 
      var post = { 
       username: scope.username, 
       password: scope.password 
      }; 

      // send post data 
      $http.post('api/default/login', post). 
       success(function(data, status) 
       { 
        // hide processing feedback and show the result 
        scope.processing = false; 
        scope.message = data.message; 
       }). 
       error(function(data, status) 
       { 
        scope.processing = false; 
       }); 
     }; 

     // Function i use to emit 
     this.closeDialog = function() 
     { 
      $scope.$emit('closeDialog'); 
     }; 
    }); 
})(angular); 

siteController.js

(function(angular) 
{ 
    var app = angular.module('Organizer'); 

    app.controller('site', function($mdDialog, $scope) 
    { 
     this.menu = ['test1', 'test2']; 

     this.dialog = function() 
     { 
      $mdDialog.show({ 
       templateUrl: 'site/login', 
      }); 
     }; 

     // this does not seem to be working 
     $scope.$on('closeDialog', function(event) 
     { 
      console.log('close dialog'); 
     }); 
    }); 
})(angular); 

Hinweis : Ich benutze eckiges Material und Sie können sehen, ich zeige einen Dialog, der ein Login ist, der Login hat seinen Controller (ich wollte es den gleichen Site - Controller verwenden, aber ich weiß nicht wie) und dieser Dialog hat eine Taste, die die Funktion closeDialog() in loginControler ruft und sollte den Dialog, aber jetzt zu Testzwecken ich gerade Anmeldung mich, wenn es ruft das Ereignis

+0

Toptals Erklärung von '$ emit' vs' $ broadcast' würde helfen: http://www.toptal.com/angular-js/videos/javascript-video-tutorial-understanding-broadcast-and-emit-in- anglejs –

Antwort

8

die $ emittieren Funktion ein Ereignis breiten sich nur auf die Bereiche Eltern schließen.

Die $ broadcast Funktion propagieren ein Ereignis zu den Bereichen Childs.

Also, was Sie brauchen, hängt davon ab, wie die Regler es verwenden ...

Wenn Sie ein Ereignis alle wollen die App erreichen Sie die $ rootScope verwenden:

$rootScope.$broadcast('myEvent'); 

Here you have the doc of the scope, include $emit and $broadcast

+0

danke, dass die funktion funktioniert, ich dachte auch, wenn es eine andere möglichkeit, diese methode durch die verwendung von $ controller zu erreichen, noch muss ich lernen, richtig zu verwenden, nur eine letzte frage, gibt es a Möglichkeit, diesen Inhalt dynamisch in einem einzigen Controller geladen zu verwenden? Ich musste einen anderen Controller erstellen, der 'loginController' ist, um ihn zu benutzen. – nosthertus

+0

Entschuldigung, ich verstehe deine Frage nicht, welchen Inhalt meinst du? –

+0

der Inhalt, der LoginController verwendet, wird durch Ajax geladen ich nehme an mdDialog in SiteController, ich habe einmal versucht, die Bereiche in diesem Inhalt mit dem gleichen SiteController zu verwenden, aber ich weiß nicht, warum es nicht funktioniert, also ich verwende ein anderer Controller dafür – nosthertus

0

Sie konnten im Dialog-Controller nicht ausgeben oder senden, da der Dialog im eckigen Material einen isolierten Bereich hat. Wenn Sie also ein Ereignis ausstrahlen oder senden, geht es nirgends hin. Der Broadcast $ emit und $ funktioniert nur, wenn Sie eine Scope-Hierarchie haben. $ emitter propagieren das Ereignis in der Hierarchie und $ broadcast propagiere das Ereignis in der Hierarchie.