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

Asynchronous Trigger.io+;js并在调用forge.ajax后更新视图,asynchronous,angularjs,trigger.io,Asynchronous,Angularjs,Trigger.io,有一个问题,到目前为止还无法找到任何解决方案,似乎类似的问题,所以工作。问题是: 使用Trigger.io的forge.ajax,返回数据后不会更新我的Angular.js视图。我意识到这是因为forge.ajax是一个非同步函数,并且在视图已经显示之后返回数据。我曾尝试使用$rootScope.apply()更新视图,但正如我所看到的许多示例所示,它对我不起作用 请参阅下面的控制器代码: function OfferListCtrl($scope) { $scope.offers =

有一个问题,到目前为止还无法找到任何解决方案,似乎类似的问题,所以工作。问题是:

使用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将使用数据库中的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>

提供
  • 描述:{{offer.Description}}
    Id:{{offer.Id}}
    创建日期:{{offer.CreatedOn}}
    已发布:{{offer.Published}}

执行此操作

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

你需要改变

$scope.fetchOffers(function(offers) {
    $scope.$apply(function(){
        $scope.offers = offers;
    });
    forge.logging.info($scope.offers);
});
这是因为对
$scope
的所有更改都必须在angular范围内进行,在这种情况下,因为您使用
forge
调用ajax请求,所以回调没有在angular框架内执行,这就是它不起作用的原因

在本例中,您可以使用在angular框架中执行代码

查看
$apply()
方法文档

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

当我这样做时,我会出现一个错误,如:“$digest已在进行中”。。。 我和q美元一起工作

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

是的,这是因为ur数据来得足够快,angular尚未完成渲染,因此更新无法更新“外部”angular

因此,请使用事件:

视图中的HTML是什么样子的?上面添加了HTML。这非常简单,当我单击我添加的按钮时,它会更新视图,该按钮只调用一个只包含$rootScope.apply()的函数。感谢您包含HTML。我只是想确定没有任何嵌套的作用域绊倒你。您是否尝试将
$scope.$apply()
放在
forge.logging.info($scope.offers)之后?这应该行得通。如果没有,那么我就没有其他想法了。你为什么不使用$http AngularJS服务来发出请求呢?马克,我先尝试了,因为它似乎是正确的位置。没用。我肯定我试过这个,但显然不行,因为它有效。我已经找到了另一个有效的解决方案,但它不像“角度的方式”,这确实有效。谢谢