2014-03-24 109 views
1

我有一個服務來存放對於多個控制器很重要的數據(在關聯數組中)。這個服務保存的數據是異步更新的。在我的控制器中,我在範圍myService上創建一個變量,併爲其分配該服務。然後,在我看來,我將數據作爲myService.theInrestrestData引用。如果這很重要,在視圖中,我引用ng-repeat中的interestingData assoc數組。由於某些原因,當數據更新(我獲得控制檯日誌)時,可見頁面不會改變,但是如果我執行一些UI操作(例如打開管理單元http://jtrussell.github.io/angular-snap.js/),那麼數據將被更新,但進一步的更改還需要一些UI操作才能看到。綁定到控制器範圍的服務更改不可見

我一定在做錯事。任何關於如何解決這個問題的建議?我想也許我需要申請被叫,但數據是在服務上沒有提及的控制器的範圍,我需要申請

請參閱這兩個版本的小提琴。兩者都顯示相同的日誌記錄,但其中一個(使用$ interval http://jsfiddle.net/a6Nhs/5/的更新)更新了「屏幕」(我在這裏討論的是什麼?DOM),另一個(window.setInterval http://jsfiddle.net/a6Nhs/4/)沒有。在我的實際應用程序中,它不是一個導致異步更新的間隔,而是通過websocket接收信息,因此對於我而言,解決方案並不像改變爲$ interval那麼簡單。

HTML:

<div ng-controller="MyCtrl"> 
    Hello, {{name}}! 
    {{numsService}} 
    <li ng-repeat="(key,val) in numsService.nums"> 
     {{key}} | {{val}} 
    </li> 
</div> 

和JS:

var myApp = angular.module('myApp',[]); 

//myApp.directive('myDirective', function() {}); 
myApp.service('myService', function() { 
    this.nums={}; 
    this.total = 0; 
}); 

myApp.service('differentService', function(myService, $interval){ 
    $interval(function(){ //using $interval works, using window.setInterval does not 
     console.log('diffService'); 
     myService.nums[myService.total+'idx']=myService.total++; 
     console.log(myService.nums); 
    }, 1000); 
}); 

function MyCtrl($scope, myService, differentService) { 
    $scope.name = 'Superhero'; 
    $scope.numsService = myService; 
} 
+2

我建議你做一個plunker http://plnkr.co/來顯示你的例子。 – PeterFromCologne

+0

@PeterFromCologne添加了小提琴和代碼 – Michael

回答

1

你可以嘗試$適用於$ rootScope:

myApp.service('differentService', function(myService, $rootScope){ 
    window.setInterval(function(){ 
     $rootScope.$apply(function(){ 
      console.log('diffService'); 
      myService.nums[myService.total+'idx']=myService.total++; 
      console.log(myService.nums); 
     }); 
    }, 1000); 
    }); 

通常情況下,當你調用$應用(EXP)在範圍上,它實際上評估exp,然後調用根作用域上的$ digest()。看看這個AngularJS service rootscope

Updated fiddle

1

作爲修改慶TO的答案,我會說避免$rootScope.$apply(),使用$timeout它嘗試應用下一個消化過程中的數據的變化,從而避免錯誤當你可能最終會併發$apply's並消除滯後。我會這樣做:

myApp.service('differentService', function (myService, $rootScope) { 
    $timeout(function(){ 
     myService.nums[myService.total+'idx']=myService.total++; 
    }); 
}); 
+0

感謝您的建議@Ashesh,但由於這是發生在一個服務中,我不會最終與'$ apply'併發,也看到我的評論部分,我解釋說,定時器只是爲了說明異步,而不是我的實際使用情況。 – Michael

+0

@Michael完美,很高興你的問題解決了。 – Ashesh

相關問題