2013-03-27 24 views
2

出現問題,目前爲止看不到任何類似SO問題的解決方案。問題是這樣的:Trigger.io + Angular.js並在調用forge.ajax後更新視圖

使用Trigger.io的forge.ajax,我的Angular.js視圖在數據返回後沒有更新。我意識到這是因爲forge.ajax是一個異步函數,並且在視圖已經顯示之後返回數據。我試圖通過使用$ rootScope.apply()來更新視圖,但對於我而言,它並不適用於我所見過的許多示例。

請參見下面的控制器代碼:

function OfferListCtrl($scope) { 

    $scope.offers = []; 

    $scope.fetchOffers = function(callback) { 

     $scope.offers = []; 

     var successCallback = function(odataResults) { 
      var rawJsonData = JSON.parse(odataResults); 
      var offers = rawJsonData.d; 
      callback(offers); 
     }; 

     var errorCallback = function (error){ 
      alert("Failure:" + error.message); 
     }; 

     forge.request.ajax({ 
      type: 'GET', 
      url: 'https://www.example.com/ApplicationData.svc/Offers', 
      accepts: 'application/json;odata=verbose', 
      username: 'username', 
      password: 'password', 
      success: successCallback, 
      error: errorCallback 
     }); 

    }; 

    $scope.fetchOffers(function(offers) { 
     $scope.offers = offers; 
     forge.logging.info($scope.offers); 
    }); 
} 

所有的代碼有工作正常,並且$ scope.offers被從數據庫提供的數據填充。日誌記錄功能顯示數據是正確的,格式正確。

我已經嘗試在邏輯位置(和一些不合邏輯的位置)使用$ rootScope.apply(),但無法獲取更新視圖。如果您有任何想法,我可以如何讓這個工作,我將不勝感激。

編輯:添加HTML

的HTML如下。用ng-click =「refresh()」記下按鈕。這只是一種解決方法,所以我至少可以看到數據。它調用一個執行$ rootScope.apply()的單行刷新函數,它會更新視圖。

<div ng-controller="OfferListCtrl"> 
     <h1>Offers</h1> 
     <ul> 
     <li ng-repeat="offer in offers"> 
      <p>Description: {{offer.Description}}<br /> 
       Id: {{offer.Id}}<br /> 
       Created On: {{offer.CreatedOn}}<br /> 
       Published: {{offer.Published}}<br /> 
      </p> 
     </li> 
     </ul> 
    <input type="button" ng-click="refresh()" value="Refresh to show data" /> 
    </div> 
+0

是什麼視圖中的HTML是什麼樣子? – 2013-03-27 15:07:19

+0

上面添加了HTML。這很簡單,當我點擊我添加的只調用一個只包含$ rootScope.apply()的函數的按鈕時,更新視圖。 – trentclowater 2013-03-28 02:54:39

+0

感謝您使用HTML。我只是想確定沒有任何嵌套示波器讓你跳動。您是否嘗試在'forge.logging.info($ scope.offers)之後放置'$ scope。$ apply()';'?這應該工作。如果沒有,那麼我沒有任何其他想法。 – 2013-03-28 03:05:23

回答

5

您需要更改

$scope.fetchOffers(function(offers) { 
    $scope.$apply(function(){ 
     $scope.offers = offers; 
    }); 
    forge.logging.info($scope.offers); 
}); 

這是因爲對$scope所有更改必須的角度範圍內進行,在這種情況下,因爲您使用調用ajax請求回調沒有在角度框架內執行,這就是爲什麼它不起作用。

在這種情況下,您可以使用$scope.$apply()在角度框架內執行代碼。

看那$apply()方法DOC

$申請()是用來從 角框架之外在角度來執行的表達式。 (例如,來自瀏覽器DOM事件, setTimeout,XHR或第三方庫)。因爲我們正在調用 角度框架,我們需要執行適當的作用域生命週期 異常處理,執行手錶。

+0

我確信我試過了,但顯然不是,因爲它的工作原理,我發現了另一種解決方案,但它不像「有角度的方式」,而且確實如此,謝謝! – trentclowater 2013-04-24 07:05:23

0

做到這一點

function MyController($scope, myService) 
{ 
    myService.fetchOffers(data){ 
     //assign your data here something like below or whateever 
     $offers = data 
     $scope.$apply(); 
    } 
}); 

感謝 DHIRAJ

相關問題