2017-11-10 9 views
3

ich wissen will, ob ich eine $rootScope.$emit in einer $rootScope.$on Funktion aufrufen kann, ist der Grund, warum ich habe zwei Controller ctrl1.js und `ctrl2.js, , und ich möchte ein Verfahren zur Herstellung ctrl2.js in meinem ctrl1.js nennen

Im sehr neu vor, eine Minute AngularJS, hier ist mein Code, danke,

/* Ctrl1 */ 
$rootScope.$on("rootScopeDisplayPage", function(event,target){ 
     $rootScope.$emit("CallAMethodFromCtrl2", target); 
}); 

/* Ctrl2 */ 
$rootScope.$on("CallAMethodFromCtrl2", function(event, target){ 
       $scope.displayArticle(target); 
}); 

$scope.displayArticle = function(articleStatus){ 
    /* do something */ 
} 

seine wie eine verschachtelte $rootScope.$on

danken Ihnen,

+0

Seien Sie vorsichtig mit '$ rootScope' - es kann Ihre Anwendung eng koppeln und es schwierig zu pflegen machen. –

+0

Vielen Dank für Ihren Vorschlag sehr nett, Derek Es gibt keinen Fehler, ich kann nicht überprüfen, nun, es funktioniert nicht und hat keinen Fehler, aber ich fragte mich, ob etwas mit meinem Code falsch ist, oder wenn jemand in der gleichen Situation stieß will wissen, ob es möglich ist, – apelidoko

+0

John Ellmore - danke, ich benutze $ rootScope nur um auf eine Methode von einem anderen Controller zuzugreifen, aber ich kann es nicht funktionieren lassen. – apelidoko

Antwort

2

$emit wird verwendet, um Daten von Kind zu Eltern zu übergeben. $rootScope ist der übergeordnete Bereich aller Elemente, daher ist es nicht sinnvoll, $emit zu verwenden. Obwohl Sie es verwenden, gibt es keine übergeordneten Elemente, um es zu erfassen.

Stattdessen können Sie das Ereignis $rootScope.$broadcast verwenden, um Inhalte zwischen Controllern zu teilen.

Für weitere Informationen refere $broadcast und $emit

angular 
 
    .module("app", []) 
 
    .controller("Controller1", function($scope, $rootScope, $timeout){ 
 
    var add = function(a, b) { 
 
     return a + b; 
 
    } 
 
    
 
    $timeout(function(){ 
 
     $rootScope.$broadcast("Add function", add); 
 
    }, 2000); 
 
    
 
    $scope.$on("Sub function", function(event, sub) { 
 
     $scope.sub = sub(1, 2); 
 
    }); 
 
    }) 
 
    .controller("Controller2", function($scope, $rootScope, $timeout){ 
 
    var sub = function(a, b) { 
 
     return a - b; 
 
    } 
 
    
 
    $scope.$on("Add function", function(event, add) { 
 
     $scope.sum = add(3, 4); 
 
     $timeout(function(){ 
 
     $rootScope.$broadcast("Sub function", sub); 
 
     }, 1000); 
 
    }); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="app"> 
 
    <div ng-controller="Controller1"> 
 
    <span ng-show="!sub">Waiting for Sub function...</span> 
 
    <span ng-show="sub">1 - 2 = {{ sub }}</span><br /> 
 
    </div> 
 
    <div ng-controller="Controller2"> 
 
    <span ng-show="sum">3 + 4 = {{ sum }}</span> 
 
    <span ng-show="!sum">Waiting for add function...</span><br /> 
 
    </div> 
 
</div>

+0

kann ich ein anderes $ rootscope anrufen. $ Broadcast in Ihrem $ rootscope. $ On? Danke, – apelidoko

+0

Ja können Sie hinzufügen. Aktualisierter Code mit dem gleichen. – MrNobody

+0

ist es obligatorisch, $ timeout zu verwenden, bevor $ broadcast verwendet wird? Danke, – apelidoko

2

Es gibt zwei Ereignis Rundfunk-Methoden:.. $ RootScope $ Broadcast() und $ rootScope $ emittieren(). Der erste sendet Ereignisse durch die Nachkommen des Oszilloskopbaums. Die $ emit() - Methode sendet Ereignisse über die Vorfahren des Bereichsbaums. Wenn Sie mit der $ rootScope. $ On() -Methode an ein Ereignis binden, wird Ihr Handler aufgerufen, unabhängig davon, wie das ursprüngliche Ereignis ausgelöst wurde (dh Broadcast vs emit).

enter image description here

So verwenden Sie können nicht mehr als $ rootScope. $ An, dass emittieren, da das emittierte Ereignis nie nach unten durch den Baum Umfang kommt.

+0

danke, ich habe eine Frage, kann ich ein $ rootscope ausführen. $ Broadcast in einem $ rootscope. $ Auf? Danke! – apelidoko

+1

@apelidoko Ja, Sie können es in Ihrem $ rootscope verwenden. $ On –

Verwandte Themen