2013-10-18 20 views
13

Damit zwei Controller in Angular miteinander kommunizieren können, wird empfohlen, einen gemeinsamen Dienst zu erstellen, der für beide Controller zugänglich ist. Ich habe versucht, dies in einem sehr einfachen fiddle zu veranschaulichen. Je nachdem, welche Schaltfläche Sie drücken, soll die App die Nachricht unter den Schaltflächen anpassen.Aktualisieren eines Controllers von einem anderen Controller in Angular

Warum funktioniert das nicht? Fehle ich etwas offensichtlich oder grundlegender?

HTML

<div ng-controller="ControllerOne"> 
    <button ng-click="setNumber(1)">One</button> 
    <button ng-click="setNumber(2)">Two</button> 
</div> 
<div ng-controller="ControllerTwo">{{number}} was chosen!</div> 

JavaScript

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

app.factory("Service", function() { 
    var number = 1; 
    function getNumber() { 
    return number; 
    } 
    function setNumber(newNumber) { 
    number = newNumber; 
    } 
    return { 
    getNumber: getNumber, 
    setNumber: setNumber, 
    } 
}); 

function ControllerOne($scope, Service) { 
    $scope.setNumber = Service.setNumber; 
} 

function ControllerTwo($scope, Service) { 
    $scope.number = Service.getNumber(); 
} 

Antwort

17

Versuchen Sie, eine Uhr in Ihrem Controller zu erstellen:

$scope.$watch(function() { return Service.getNumber(); }, 
    function (value) { 
     $scope.number = value; 
    } 
); 

Hier ist eine Arbeits Geige http://jsfiddle.net/YFbC2/

+0

Meine Frage war eigentlich eine vereinfachte Version von meinem eigentlichen Code, der * viel * komplexe (zu viel SO schreiben auf). In meinem komplexen Setup hat Peters Vorschlag mein Problem nicht gelöst, obwohl es tatsächlich die beste Lösung für die spezifische Frage ist, die ich gestellt habe (+1). Das Hinzufügen einer Uhr war genau das, was ich brauchte, also wählte ich dies als die richtige Antwort (in meinem Fall). Danke allen! –

5

Scheint wie Problem mit property that holds a primitive value. So können Sie diese Änderungen vornehmen:

app.factory("Service", function() { 
    var number = {val: 1}; 
    function getNumber() { 
     return number; 
    } 
    function setNumber(newNumber) { 
     number.val = newNumber; 
    } 
    return { 
     getNumber: getNumber, 
     setNumber: setNumber, 
    } 
}); 

Siehe fiddle

+0

Dies ist der korrekte Weg der drei vorgeschlagenen Lösungen. – ganaraj

3

Rufen Sie einfach in HTML Service.getNumber() und in Controller ControllerTwo Anruf-Service wie:

$scope.Service = Service; 

Beispiel:

HTML

<div ng-controller="ControllerOne"> 
    <button ng-click="setNumber(1)">One</button> 
    <button ng-click="setNumber(2)">Two</button> 
</div> 
<div ng-controller="ControllerTwo">{{Service.getNumber()}} was chosen!</div> 

JS

function ControllerOne($scope, Service) {  
    $scope.setNumber = Service.setNumber; 
} 

function ControllerTwo($scope, Service) { 
     $scope.Service = Service; 
} 

Demo Fidlle

Verwandte Themen