2014-03-29 125 views
3

無法弄清楚此代碼中的錯誤是什麼。我試過只在這裏發佈代碼的相關部分。AngularJs變量未更新

控制器

myApp.controller('MessageCtrl', function ($scope, notificationService, $rootScope) { 


    $scope.notificationService = notificationService; 
    $scope.msgCount = 0; 
    $scope.notificationService.subscribe({channel : 'my_channel'}); 

    $rootScope.$on('pubnub:msg',function(event,message){ 
     $scope.msgCount = $scope.msgCount + 1; 
     //$scope.$digest(); 
    }); 

}); 

我的通知角服務

myApp.factory('notificationService',['$rootScope', function($rootScope) { 
    var pubnub = PUBNUB.init({ 
     publish_key : '..', 
     subscribe_key : '..' 
    }); 

    var notificationService = { 
     subscribe : function(subscription) { 
      pubnub.subscribe({ 
       channel : subscription.channel, 
       message : function(m){ 
        $rootScope.$broadcast('pubnub:msg', m); 
       } 
      }); 

     } 
    }; 
    return notificationService; 
}]); 

而且模板

<div> 

    Count = {{msgCount}} 
</div> 

問題

使用控制檯日誌&使用因緣測試中,我已經證實,當我從通知服務做$broadcastMessageCtrl$rootScope.$on方法獲取調用。並且msgCount變量正在遞增。但是,我沒有看到更新的值反映在模板中,而沒有運行 a $scope.$digest()。我很確定我不應該需要呼叫$scope.$digest,即Angular應該爲我提供這種綁定。

有趣的是,當我從另一個控制器嘗試$rootScope.$broadcast時,模板中的msgCount增加了,而不必調用$scope.$digest()。

任何人都可以在這裏幫助我。謝謝。

更新 感謝彼得看着谷歌的小組討論,包裹在$apply$broadcast奏效了。

$rootScope.$apply(function(){ 
         $rootScope.$broadcast('pubnub:question', m); 
        }); 

回答

9

看來你$broadcast外面發生和AngularJS你需要調用$apply()通知你的應用程序有關,但做的更好的notificationService

至於$廣播和$觸發申請/摘要,你可以在this post閱讀。 AngularJs源文件的簡要概述使我確信$廣播不會自動應用更改(look here)。 $廣播只是調用監聽器,沒有別的。

請看看jsFiddle上的這個簡單例子。

模板

<div ng-controller="myCtrl"> 
    <p>Count: {{ count }}</p> 
    <button ng-click="fireEvent()">Fire Event</button> 
</div> 

控制器

angular.module("app", []) 
.controller('myCtrl', function($scope, $rootScope, notificationService) { 
    $scope.count = 0; 
    notificationService.subscribe(); 
    $rootScope.$on('event', function() { 
     console.log("event listener"); 
     $scope.count++; 
    }); 

    $scope.fireEvent = function() { 
     // it is ok here due to ngClick directve 
     $rootScope.$broadcast('event', true); 
    }; 
}) 

而且工廠

.factory('notificationService',['$rootScope', function($rootScope) { 

    var notificationService = { 
     subscribe : function() { 
      setInterval(function(){ 
       console.log("some event happend and broadcasted"); 
       $rootScope.$broadcast('event', true); 
       // angular does not know about this 
       //$rootScope.$apply(); 
      }, 5000); 
     } 
    }; 
    return notificationService; 
}]); 

當然在這兩種情況下,您都會看到事件偵聽器觸發,但ngClick觸發$摘要,而您的notificationService則不觸發。

此外,你可以得到一些信息源將啓動摘要cicle在這個很好的答案https://stackoverflow.com/a/12491335/1274503