2013-04-09 2 views
16

私はビジネスロジックを分離し、その情報を必要とするコントローラに注入するサービスを作成しました。私が最終的にやってみたいのは、コントローラがサービスの値を見ることができるようにすることです。ブロードキャスト/オン通知や複雑なメッセージパッシングソリューションを使用して、すべてのコントローラにデータの変更が通知されるようにしますサービス。コントローラからサービスの値を見る

私は何をしようとしているのかの基本的なアイデアを示すplnkrを作成しました。

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

それは、コントローラは、サービスの値を見ることは可能ですか?

+2

私のdownvoteはplunkerがなくなってしまったので、この質問(および答え)を役に立たないようにするコードもあります。 :(ここにコードを入れて質問を+1します) –

答えて

48

あなたは既にそれを正しく行っていました。すなわち、サービスをスコープ変数にプッシュし、次にサービスをスコープ変数の一部として観察することである。ここで

はあなたのための実用的なソリューションです:

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

あなたは逃したものの一部です

  1. $ scope。$ watchの変数の順序が間違っていました。その(newVal、oldVal)、それ以外の方法ではありません。
  2. 非同期操作であるsetIntervalを使用していたので、角度が変更されたことを角度に知らせなければなりません。そういうわけで$ rootScope。$ applyが必要です。
  3. $関数を見ることはできませんが、関数が返す関数を見ることができます。
+1

パンクコードがなくなった(または私はそれを見ることができません)。回答の内容は、サードパーティのウェブサイトではなく、あなたの+ 1. –

+0

@ BernhardHofmann ++。私は年齢で働いているplnkrをクリックしていません。 –

+0

@BernhardHofmann私はプランナーからコードをインライン化しました。 – ganaraj

関連する問題