2013-10-04 47 views
0

我嘗試通過$ http定期調用DataService來獲取json文件。AngularJS手錶定期json

然後,我想使用$ watch功能對任何數據更改作出反應。然而,手錶功能永遠不會觸發多次。爲什麼?

var app = angular.module('myApp', ['ngRoute']). 
    config(['$routeProvider', function ($routeProvider) { 
     //... 
    }]) 

    . 

    run(function ($rootScope, $timeout, $location, DataService) { 

     $rootScope.jsonData = {} 

     var delaytime = 10 * 1000; 

     $rootScope.jsonData = DataService.getData(); 

     $timeout(function repeat() { 
       console.log("in repeat") 
       $rootScope.jsonData = DataService.getData(); 
       $timeout(function() { 
         console.log("in inner repeat") 
         repeat(); 
        }, delaytime 
       ); 
      }, delaytime 
     ); 



     console.log("xxx") 
     console.log($rootScope.jsonData) 
     $rootScope.$watch('jsonData', reactToDataChange($rootScope, $location)); 
    }) 


; 


function reactToDataChange($rootScope, $location) { 
    console.log("yyy") 
    console.log($rootScope.jsonData) 
    // ... 
} 

的DataService:

app.service('DataService', function ($http) { 

var data = null; 

function setData(newdata) { 
    data = newdata; 
} 

return { 

    getData: function() { 

     console.log("getting data"); 

     var rand = "?rand=" + Math.random() * 10000; 
     $http.get('data/bla.json' + rand, {cache: false}) 

      .success(function (newdata) { 
       console.log(newdata); 
       setData(newdata); 
      }) 
      . 

      error(function (data, status, headers, config) { 
       console.log("error"); 
       console.log(status) 
      }); 


     return data; 
    } 
}; 
}); 

控制檯顯示:

getting data 
xxx 
null 
yyy 
null 
new data:[object Object] 
Object {bla: Object} 
in repeat 
getting data 
new data:[object Object] 
Object {bla: Object} 
in inner repeat 
in repeat 
getting data 
new data:[object Object] 
Object {bla: Object} 
in inner repeat 
in repeat 
... 

爲什麼不YYY再次顯示?

+0

我看不到在你的DataService中定義'getData()',我想知道它是如何工作的。它不應該在DataService的'return'裏面有getData:function(){/ *當前返回的內容* /}嗎? – lort

+0

抱歉,我在編輯問題的代碼時刪除了內部函數聲明。現在更新的版本 – IHeartAndroid

回答

1

簡短回答你:「爲什麼?」是$ watch需要函數作爲第二個參數,而您通過reactToDataChange($rootScope,$location)這是一個函數調用並返回undefined。這很容易通過修改reactToDataChange解決它:

function reactToDataChange($rootScope, $location) { 
    return function(){ 
     console.log("yyy") 
     console.log($rootScope.jsonData) 
     // ... 
    } 
} 

通過您的重複是過於複雜的方式。爲什麼不試試這個:

var rep = function(){ 
    $timeout(function(){ 
     $rootScope.jsonData = DataService.getData(); 
     rep(); 
    },delaytime); 
} 
rep(); 
0

試試這個:

$rootScope.$watch('jsonData', reactToDataChange($rootScope, $location), true); 
+0

不會改變任何東西。即使我在運行 – IHeartAndroid

0

試圖改變

function reactToDataChange($rootScope, $location) { 
    console.log("yyy") 
    console.log($rootScope.jsonData) 
} 

function reactToDataChange($rootScope, $location) { 
    return function(){ 
     console.log("yyy") 
     console.log($rootScope.jsonData) 
    } 
} 

你應該申請true作爲第三個參數爲$腕錶開始 「深度觀望」 jsonData的object:

$rootScope.$watch('jsonData', reactToDataChange($rootScope, $location), true); 

而且你不經過rootScope回調訪問jsonData新的價值,只是使用第一個參數:

$rootScope.$watch('jsonData', reactToDataChange, true); 
.... 
function reactToDataChange(value) { 
    console.log(value); 
} 
+0

的某個位置更改了bla.json,也感謝代碼的改進。他們似乎並沒有解決我的問題。 – IHeartAndroid