2013-04-09 15 views
16

İş mantığını yalıtmak için bir hizmet oluşturdum ve bilgileri gereken denetleyicilere enjekte ediyorum. Nihayetinde yapmak istediğim, kontrolörlerin hizmetteki değerleri izleyebilmeleri, böylece tüm denetleyicilerin verideki değişikliklerden haberdar edilmesini sağlamak için yayın/bildirimde bulunma veya karmaşık bir iletme çözümünü yapmak zorunda kalmamamdır. hizmet.Bir denetleyiciden bir hizmette değerler izleme

Yapmaya çalıştığım şeyin temel fikrini gösteren bir plnkr oluşturdum.

http://plnkr.co/edit/oL6AhHq2BBeGCLhAHX0K?p=preview

bir kontrolör hizmetin değerlerini izlemek mümkün mü?

+2

İndirgemem nedeni, plunker'ın gitmesi, dolayısıyla bu soruyu (ve yanıtı) işe yaramaz hale getiren koddur. :(Kodu buraya koy, ben de soruyu + 1'leyeceğim –

cevap

48

Zaten bunu doğru yapıyordunuz. yani hizmeti bir kapsam değişkenine zorlamak ve sonra hizmeti kapsam değişkeninin bir parçası olarak gözlemlemek.

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

app.service('myService', function($rootScope) { 
    var data = 0; 
    var id = 0; 

    var increment = function() { 
    data = data + 1; 
    $rootScope.$apply(); 
    console.log("Incrementing data", data); 
    }; 

    this.start = function() { 
    id = setInterval(increment, 500) ; 

    }; 

    this.stop = function() { 
    clearInterval(id); 
    }; 

    this.getData = function() { return data; }; 

}).controller('MainCtrl', function($scope, myService) { 
    $scope.service = myService; 
    $scope.controllerData = 0; 

    $scope.start = function() { 
    myService.start(); 
    }; 

    $scope.stop = function() { 
    myService.stop(); 
    }; 

    $scope.$watch('service.getData()', function(newVal) { 

    console.log("New Data", newVal); 
    $scope.controllerData = newVal; 
    }); 
}); 

kaçırdığınız bazı şeyler şunlardır:

<!doctype html> 
<html ng-app="plunker" > 
<head> 
    <meta charset="utf-8"> 
    <title>AngularJS Plunker</title> 
    <script>document.write('<base href="' + document.location + '" />');</script> 
    <link rel="stylesheet" href="style.css"> 
    <script src="http://code.angularjs.org/1.1.3/angular.js"></script> 
    <script src="app.js"></script> 
</head> 
<body ng-controller="MainCtrl"> 
    <button ng-click="start()">Start Count</button> 
    <button ng-click="stop()">Stop Count</button> 
    ControllerData: {{controllerData}} 
</body> 
</html> 

JavaScript

http://plnkr.co/edit/SgA0ztPVPxTkA0wfS1HU?p=preview

HTML: Burada

sizin için çalışma çözümdür
  1. $ scope. $ Watch değişkenlerinin sırası yanlış. Onun (newVal, eskiVal) ve diğer şekilde değil.
  2. Eşzamansız bir işlem olan setInterval ile çalıştığınız için, şeylerin değiştiğini anlayabilmeniz gerekir. Bu yüzden $ rootScope'a ihtiyacınız var.
  3. $ Bir işlevi izleyemezsiniz, ancak işlevin ne döndüğünü izleyebilirsiniz.
+1

Punker kodu gitti (ya da göremiyorum). Lütfen cevabının içeriğini buraya koy. 1. –

+0

@ BernhardHofmann ++ Ben bir çalışma plnkr çağda tıklatmadı. –

+0

@BernhardHofmann Ben plunker kodu inline var. – ganaraj

İlgili konular