2014-02-26 69 views
0

我一直試圖顯示一些消息後端返回的Angular ajax調用響應。 我有一個服務用於共享不同控制器的數據(ShareDataService)。

'use strict'; 
var angularPOC = angular.module('angularPOC'); 
    angularPOC.factory('ShareDataService', [ '$timeout', function($timeout) { 
    var messages = []; 
    var service = { 
    setMessage : function(messageText, messageType) { 
     $timeout(function() { 
     messages = []; 
     messages.push({ 
      'text' : messageText, 
      'type' : messageType}); 
    }); 
    }; 
    return service; 
}]); 

然後,我有一個控制器,它依賴於數據服務設置,並應該根據數據變化更新視圖:

'use strict'; 
var MessageControllers = angular.module('MessageControllers', []); 
var angularPOC = angular.module('angularPOC'); 
angularPOC.controller('MessageController', ['$scope', '$routeParams', '$timeout', 'ShareDataService', function($scope, $routeParams, $timeout, ShareDataService) { 

    $scope.shareService = ShareDataService; 
    $scope.messages = ShareDataService.messages; 
    $scope.$watch('ShareDataService.messages', 
    function(newVal) { 
     alert("newval: " + JSON.stringify(newVal)); 
     alert("sharedata: " + JSON.stringify(scope.shareService.messages)); 
     $scope.messages = newVal; 
     // or 
     // $scope.getMessages(); 
    } 
); 

    $scope.getMessages = function() { 
    $scope.messages = ShareDataService.getMessages(); 
    return $scope.messages; 
    }; 
}]); 

的$手錶將趕上「一些」事件中潛在的數據變化,但'警報'將顯示'newVal'是'未定義'。 「sharedata」將在更改之前按原樣打印消息。 此外,當試圖使用該方法顯式獲取數據時,它會對舊數據感到厭煩。

但是,如果我在頁面上放置一個按鈕來顯式調用範圍中的getMessages(),它將獲得正確的數據!

看起來「服務」似乎比它應該在$ watch中落後了一步。

我讀過幾個關於如何使用$ watch的例子/教程,這對我來說似乎是正確的,但是它不能像預期的那樣工作?

請指教。謝謝。

回答

1

我不知道這背後的原因,我也有類似的問題,一些幾個月前得到它做如下

$scope.$watch(function() { return ShareDataService.getMessages() }, function(){ 
    //your code 
}); 

不知道這是正確的解決方案解決。如果沒有其他解決方案適用於您,請使用它。

+0

哇。當你試圖讓某些東西長時間工作並最終成功時,你給了我那種溫暖的模糊感。 :D它工作完美。 –

0

您的$watch不起作用是因爲您的$scope上沒有一個名爲ShareDataService的房產。

您已經命名的屬性shareService,所以正確的$watch調用是:

$scope.shareService = ShareDataService; 
$scope.$watch('shareService.messages', function(newVal) { 
    $scope.messages = newVal; 
}); 

編輯: 隨着doodeec正確地指出,你缺少的ShareDataServicemessages屬性,以及:

var angularPOC = angular.module('angularPOC'); 
angularPOC.factory('ShareDataService', ['$timeout', 
    function($timeout) { 
     var messages = []; 
     var service = { 
      setMessage: function(messageText, messageType) { 
       $timeout(function() { 
        messages = []; 
        messages.push({ 
         'text': messageText, 
         'type': messageType 
        }); 
       }); 
      }, 
      messages: messages 
     }; 
     return service; 
    } 
]);