2013-04-09 30 views
16

Tôi đã tạo một dịch vụ để tách biệt logic nghiệp vụ và đang tiêm nó vào bộ điều khiển cần thông tin. Điều tôi muốn cuối cùng là có bộ điều khiển có thể xem các giá trị trong dịch vụ để tôi không phải phát sóng/thông báo hoặc giải pháp truyền thông điệp phức tạp để tất cả các bộ điều khiển được thông báo về những thay đổi đối với dữ liệu trong dịch vụ.Xem giá trị trong dịch vụ từ bộ điều khiển

Tôi đã tạo một plnkr thể hiện ý tưởng cơ bản về những gì tôi đang cố gắng làm.

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

Có thể có một bộ điều khiển xem các giá trị của một dịch vụ?

+2

Lưu ý của tôi là vì trình ngắt thư bị mất, do đó, mã sẽ hiển thị câu hỏi này (và trả lời) vô ích. :(Đặt mã ở đây và tôi sẽ +1 câu hỏi của bạn –

Trả lời

48

Bạn đã làm đúng. tức là đẩy dịch vụ vào một biến phạm vi và sau đó quan sát dịch vụ như một phần của biến phạm vi.

Dưới đây là giải pháp làm việc cho bạn:

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

HTML

<!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:

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; 
    }); 
}); 

Dưới đây là một số trong những điều bạn bỏ lỡ:

  1. Thứ tự các biến trong phạm vi $. $ Xem là sai. Của nó (newVal, oldVal) và không phải là cách khác xung quanh.
  2. Vì bạn đang làm việc với setInterval, một hoạt động không đồng bộ, bạn sẽ phải cho phép góc nhìn biết mọi thứ đã thay đổi. Đó là lý do tại sao bạn cần $ rootScope. $ Áp dụng.
  3. Bạn không thể $ xem một hàm, nhưng bạn có thể xem hàm trả về của hàm.
+1

Mã punker đã biến mất (hoặc tôi không thể nhìn thấy nó). Vui lòng đặt nội dung câu trả lời ở đây, không phải trên trang web của bên thứ ba để nhận được + 1. –

+0

@ BernhardHofmann ++ Tôi đã không bấm vào một plnkr làm việc ở độ tuổi. –

+0

@BernhardHofmann Tôi đã inlined mã từ plunker – ganaraj

Các vấn đề liên quan