Asynchronous Trigger.io+;js并在调用forge.ajax后更新视图
有一个问题,到目前为止还无法找到任何解决方案,似乎类似的问题,所以工作。问题是: 使用Trigger.io的forge.ajax,返回数据后不会更新我的Angular.js视图。我意识到这是因为forge.ajax是一个非同步函数,并且在视图已经显示之后返回数据。我曾尝试使用$rootScope.apply()更新视图,但正如我所看到的许多示例所示,它对我不起作用 请参阅下面的控制器代码: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 =
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服务来发出请求呢?马克,我先尝试了,因为它似乎是正确的位置。没用。我肯定我试过这个,但显然不行,因为它有效。我已经找到了另一个有效的解决方案,但它不像“角度的方式”,这确实有效。谢谢