Trigger.io + Angular.js并在调用forge.ajax后更新视图

时间:2013-03-27 12:12:14

标签: asynchronous angularjs trigger.io

遇到问题,到目前为止无法为看似相似的SO问题找到解决方案。问题是:

使用Trigger.io的forge.ajax,我的Angular.js视图在返回数据后不会更新。我意识到这是因为forge.ajax是一个异步函数,并且在已经显示视图后返回数据。我曾尝试使用$ rootScope.apply()来更新视图,但它对我不起作用,如我所看到的许多示例所示。

请参阅下面的Controller代码:

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将使用数据库中的Offer数据填充。记录功能显示数据正确,格式正确。

我尝试在逻辑位置(以及一些不合逻辑的位置)使用$ 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>

3 个答案:

答案 0 :(得分:5)

您需要更改

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

这是因为$scope的所有更改都必须在角度范围内进行,在这种情况下,因为您使用forge调用ajax请求,回调不在角度框架内执行,这就是为什么它不起作用。

在这种情况下,您可以使用$scope.$apply()来执行angular framework中的代码。

查看$apply()方法doc

  

$ apply()用于从外部执行角度表达式   角度框架。 (例如,来自浏览器DOM事件,   setTimeout,XHR或第三方库)。因为我们正在呼唤   我们需要执行适当范围生命周期的角度框架   异常处理,执行手表。

答案 1 :(得分:0)

这样做

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

由于 DHIRAJ

答案 2 :(得分:0)

  

当我这样做时,我有一个错误:“$ digest已在进行中”......   我正在使用$ q ...

     

有人知道如何解决这个问题吗?

是的,这是因为你的数据足够快而且角度还没有完成渲染,所以更新不能更新“外部”角度。

所以使用事件: http://bresleveloper.blogspot.co.il/2013/08/angularjs-and-ajax-angular-is-not.html