0

在我的AngularJS應用程序我必須永久檢查服務器端的新條目,然後更新客戶端應用程序中保存的當前數據。AngularJS後臺任務指令更新控制器

因此,舉例來說,我有一個控制器MyController其中包含orders包含Order對象。 當一個新的Order是通過另一個客戶端的服務器端上的REST API創建的時,我想在我的應用程序中獲取更新。 所以我寫了一個directiveorderRefresher它應用於<body>並運行一個$interval,每120秒獲取所有訂單。 當提取新的Orders時,它們從$rootScope廣播。

MyController存在一個偵聽器,當廣播匹配事件時更新訂單。

問題是,因爲偵聽器設置爲$scope,並且在控制器被破壞時不被破壞,當我嘗試設置orders屬性(不存在)時,會導致錯誤。

我想過只是把它包裝在try-catch裏面,但是我必須等到$interval再次運行才能在控制器重新實例化時獲得更新。

那麼我該如何解決這個問題呢? 有沒有更好的解決方案,然後我的?

回答

0

最好的解決辦法是把你的HTTP邏輯裏面有服務(在整個應用程序的生命週期存在一個單身)

您可以有一個控制器做出的$interval請求或讓服務做到這一點。然後控制器可以通過$watch生成的訂單來節省您不得不廣播該事件。

像這樣的事情

app.service(
    "orderService", 
     function($http, $interval) { 
      // Return public API. 
      var api = { 
       orders: [] 
      }; 

      $interval(update, 10000); //10 second interval 

      return api; 

      function update(){ 
       $http("/api/request").then(function(response){ 
        api.orders = response.data; 
       }); 
      } 
     }); 

在你的控制器簡單地注入orderService,然後像做

$scope.$watchCollection(
    function(){ 
     return orderService.orders 
    }, 
    function(){ 
     console.log("orders have changed"); 
    });