2016-07-20 93 views
1

我有一個角度的服務建立像 -AngularJS服務更新控制變量

function updateViewService($http, $interval) { 
var change = true; 
var grabTimeStamp = function(){ 
    $http.get('someapi').then(function success(response){ 
     //some logic to change var change according to the response 
} 
$interval(grabTimeStamp, 10000); 
return { refresh: function(){ 
     return change; 
    }}; 
} 

現在我需要做的是在控制器很快恢復change並更新控制器變量作爲服務change變化。

我懷疑是在控制器中,服務返回函數只返回一次該值。所以我在調用服務時在我的控制器中嘗試了$interval,但它並沒有更新控制器變量。

我有很多控制器,這就是爲什麼我做了一個服務,應該更新所有的控制器。

然後,我試圖$rootScope.$broadcast每當change變化的變化。試圖聽廣播控制器與$scope.$on,但沒有奏效。

if(change === true){ 
    $rootScope.$broadcast('dataChanged',change); 
    change = false; 
} 

什麼應該是這樣做的理想方法?

基本上就是我想要做的是 -

  1. 創建一個服務,使每十秒的請求,並更新change變量(完成)

  2. 通過這個變量來控制和更新該視圖(基本上向後端請求並獲得新數據{卡住})

謝謝。

+0

當你開始事件時,你會得到什麼錯誤? – Karim

+0

沒有錯誤 – ThatBird

回答

1

所以你想知道什麼時候在你的服務裏面改變變量值?

您可以使用$scope.$watch

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

 
angular.module('app').service('someService', function ($interval, $q) { 
 
    var change = 0; 
 
    
 
    $interval(function() { 
 
    $q.resolve(Math.random()) //some promise, maybe from $http, but for sake of simplicity I will use $q.resolve 
 
     .then(function (result) { 
 
     change = result; //setting change to random value 
 
     }); 
 
    }, 1000); //changes every second 
 
    
 
    return { 
 
    getChange: function() { 
 
     return change; 
 
    } 
 
    }; 
 
}); 
 

 
angular.module('app').controller('Example', function ($scope, someService) { 
 
    $scope.$watch(someService.getChange, function (change) { ///adding watcher on someService.getChange, it will fire when change changes value 
 
    this.change = change; //setting change to controller here you can put some extra logic 
 
    }.bind(this)); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.js"></script> 
 
<div ng-app="app" ng-controller="Example as Ex"> 
 
    {{Ex.change}} 
 
</div>

雖然事件應該也行,願意分享在行動代碼的一些示例(的jsfiddle,片段或類似的東西)?

+0

iirc $ scope。$ watch以表達式字符串作爲第一個參數並且表達式應該是$ scope的一個屬性,只是好奇這是甚麼工作? –

+0

@HarryLim它可以帶字符串,但功能也被接受。是的,它可以工作,每當這個功能的結果發生變化時它就會被觸發。 Ofc這個函數在$ digest循環中被調用了很多,所以它應該很簡單。充其量只是一些吸氣劑,沒有沉重的邏輯。 – sielakos

+0

你是對的,我只是檢查了文檔。 –

0

你可以做的是創建一個簡單的輪詢服務。它會以指定的時間間隔發出請求。下面我將如何做到這一點:

function updateViewService($http, $timeout) { 
    var grabTimeStamp = function(callback) { 
    return $http.get('someapi').then(function success(response) { 
     //some logic to change var change according to the response 
     return response.data; 
    }); 
    } 

    var poll = function(action, interval) { 
    return $timeout(function() { 
     grabTimeStamp() 
     .then(action) 
     .then(poll.bind(null, action, interval)) 
    }, interval); 
    }; 

    return { 
    grabTimeStamp: grabTimeStamp, 
    poll: poll 
    } 
} 

app.factory('dataService', updateViewService); 

那麼你可以使用它在控制器這樣的:

dataService.poll(function(data) { 
    $scope.data.push(data); 
}, 1000); 

演示:http://plnkr.co/edit/MWBlhJzJUh7UJSCJdfPg?p=info

0

您提供該事件的解決辦法應該工作,但該服務必須注入控制器中實際上該服務必須由控制器之前的Angular實例化。

.service(function updateViewService($http, $interval, someService) { 
var change = true; 
var grabTimeStamp = function(){ 
$http.get('someapi').then(function success(response){ 
    //some logic to change var change according to the response 
    if(change === true){ 
    $rootScope.$broadcast('dataChanged',change); 
    change = false; 
    } 
} 
$interval(grabTimeStamp, 10000); 

}) 

.controller(function($rootScope, updateViewService){ 
    $rootScope.$on('dataChanged', function(){ 
    //do something 
    }); 
}) 
相關問題