嘿伙计,所以我只是在我的应用程序启动时尝试加载数据。但是,视图加载速度比http请求(当然)。一旦我的数据被正确加载,我想刷新我的视图,因为该数据定义了我的视图。
我已经在我的http请求工厂内尝试了$ rootScope.apply,我也尝试使用$ scope.apply直接在我的控制器中执行http请求,但两个都没有工作,因为他们都给了我“$ digest已在进行中”
知道如何设置我的代码以使我的视图在数据加载时刷新?我将有几个不同的http请求,我想知道如何正确设置它们!我真的很感激任何意见!
以下是我正在使用的一些代码。
app.factory('HttpRequestFactory', function($http, $q) {
var HttpRequestFactory = {
async: function(url, params) {
var deferred = $q.defer();
$http({
url: url,
method: post,
params: params
})
.success(function(data, status, headers, config) {
deferred.resolve(data);
})
.error(function(data, status, headers, config) {
deferred.reject("An error occurred");
});
return deferred.promise;
}
};
return HttpRequestFactory;
});
厂
function initializeAll(){
HttpRequestFactory.async('../api', {action: 'getall'}).then(function(data) {
//$rootScope.$apply(function () {
allData = data;
//});
angular.forEach(allData, function(value, index){
console.log('Voala!');
});
});
}
控制器调用工厂的函数initializeAll()
app.controller("MainController", ["$scope", "$rootScope","MyFactory",
function($scope, $rootScope, MyFactory){
MyFactory.initializeAll();
}
]);
答案 0 :(得分:3)
哦,我的!
你对AngularJS有f * * 的问题!
事实上,您必须执行“safeApply”,例如:
$rootScope.safeApply = function(fn) {
var phase = this.$root.$$phase;
if(phase == '$apply' || phase == '$digest') {
if(fn && (typeof(fn) === 'function')) {
fn();
}
} else {
this.$apply(fn);
}
};
在AngularJS中,你只能同时拥有一个$ apply或$ digest循环。
有关这些循环的详细信息,请查看文档: http://docs.angularjs.org/guide/concepts
它将解释什么是$ apply循环,你会理解很多关于AngularJS中双向数据绑定的东西
希望它有所帮助。
答案 1 :(得分:3)
调用$apply
(几乎)总是错误的做法。唯一一次你应该调用它的是你是否已经触发了一种“有角度”方法之外的变化;在这里,由于触发发生在角度$http
请求中,因此您无法调用$apply
,因为此时$http
块已经完成了此操作。相反,你想要做的是$watch
。
Official Doc for $scope.$watch() here
这将让您观看对象并在其发生变化时进行更新。我假设您的观点基于allData
,您希望它立即更新;如果您使用ng
方法,则会自动为您设置手表,不再需要其他工作。如果你自己在控制器中使用allData
,你可以像这样在控制器中编写手表:
$scope.$watch(function thingYouWantToWatch(){
return <accessor call to allData here>;
},
function whatToDoOnChange(newValue, oldValue){
$scope.myCoolThing = newValue; //this is the newValue of allData, or whatever you're watching.
}
);