2016-09-15 5 views
0

下記の工場とコントローラをご覧ください。私は自分のコントローラーで工場を参照したいと思う。私はコントローラがAPIからの実行カウントにアクセスできるようにしたい。

現時点では、$ timeoutの実行後にコントローラを新しい値で更新できません。

理想的には、コントローラーではなく工場で$タイムアウトを維持したいと考えています。私は、問題は私がタイムアウトでコールバックを持っていないということだと思います、誰かが私を正しい方向に向けることができますか?

工場

angular.module('MyPoller', []).factory('MyPoller', function(
    $http,$filter,$timeout) { 
    var data = { response: {}, calls: 0 }; 

    var poller = function (successCallback) { 
     $http.get('https://jsonplaceholder.typicode.com/posts').then(function (r) { 
      data.response = r.data; 
      data.calls++; 
      successCallback(data); 
      $timeout(poller, 10000); 
     }); 
    }; 

    return { 
     poller: poller 
    }; 
}); 

コントローラ

angular.module('NavBarCtrl', []) 
     .controller('NavBarCtrl', function NavBarCtrl($scope, $document, $window, $dropdown, $modal, $timeout, MyPoller) { 

    var ctrl = this; 

    MyPoller.poller(function(data) { 
     ctrl.numberNewMessages = data.calls; 
    }); 
}) 
+0

あなたは、 "コントローラを更新できない" という結論に至りましたか? 'numberNewMessages'をテンプレートに表示しようとしていますか?もしそうなら、 '$ scope.numberNewMessages'を使います。 – tcooc

+0

メッセージを再入力する必要があります。私は編集して更新します。 $ timeoutが実行された後、コントローラを新しい値で更新できません。 – defaultcheckbox

答えて

0

あなたはゲッターと工場を使用して$scope.$watch()を使用せずにこれを行うことができます。問題は、callsがプリミティブなので、最初にAngularがプリミティブが変更されることを期待していないため、自動的に変更をチェックしなくなります。代わりに親オブジェクトを参照すると、Angularは自動的に変更を監視します。

angular.module('app', []) 
 
    .factory('dataService', function($timeout) { 
 
    var _data = { 
 
     response: {}, 
 
     calls: 0 
 
    }; 
 
    var service = { 
 
     get data() { 
 
     return _data; 
 
     } 
 
    }; 
 

 
    function incrementCalls() { 
 
     _data.calls++; 
 
     $timeout(function() { 
 
     incrementCalls(); 
 
     }, 2000); 
 
    } 
 

 
    incrementCalls(); 
 
    return service; 
 
    }) 
 
    .controller('ctrl', function($scope, dataService) { 
 
    $scope.data = dataService.data; 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular.min.js"></script> 
 
<div ng-app="app" ng-controller="ctrl"> 
 
    Calls: {{data.calls}} 
 
</div>

アップデート - 上記と同じですが、ゲッター
を使用しなくても大きな問題は、あなたがしたいということである:ここではあなたがこれを行う可能性があります一つの方法を説明するために簡略化した例ですオブジェクトのプリミティブプロパティではなく、サービスから返されたオブジェクトを参照します。オブジェクトを参照することで、自動配線をAngularで取得して変更を監視します。

angular.module('app', []) 
 
    .factory('dataService', function($timeout) { 
 
    var _data = { 
 
     response: {}, 
 
     calls: 0 
 
    }; 
 
    var service = { 
 
     data: _data 
 
    }; 
 

 
    function incrementCalls() { 
 
     _data.calls++; 
 
     $timeout(function() { 
 
     incrementCalls(); 
 
     }, 2000); 
 
    } 
 

 
    incrementCalls(); 
 
    return service; 
 
    }) 
 
    .controller('ctrl', function($scope, dataService) { 
 
    $scope.data = dataService.data; 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular.min.js"></script> 
 
<div ng-app="app" ng-controller="ctrl"> 
 
    Calls: {{data.calls}} 
 
</div>

+0

ありがとう@Lex .. var service = {get data(){return _data; }}; $ http.get( 'https://jsonplaceholder.typicode.com/posts')約束ですか? – defaultcheckbox

+0

あなたは工場で$ timeoutを使ってこのように自分のポーリングを設定するのがベストプラクティスと言えますか? – defaultcheckbox

+0

私はベストプラクティスを話すことはできませんが、工場では '$ timeout'を置くことに問題はありません。特に、複数のコントローラでこれを使用すると、意味があります。 'get data()'メソッドに何を置くべきかについては、それはそのままであるべきです。 '$ timeout'で呼び出す関数は、' $ http.get() 'を呼び出した場所です。 '_data'のプロパティに新しい値を割り当てると、Angularは変更を見て、コントローラは変更を見て、あなたのビューは適切に更新されます。 – Lex

関連する問題