我在角度运行方法中使用角度服务“AzureMobileClient”进行api调用,如下所示:
myModule.run(function ($rootScope, $localStorage, AzureMobileClient, Data) {
//Return user json object; store it in Data.customerUserJsonObject
AzureMobileClient.getCustomerUser(function (item) {
$rootScope.$apply(function () {
Data.customerServerRowObject = item;
console.log("rootScope applied");
});
console.log("myModule.run: item >");
console.log(item);}, $localStorage.phonenumber);
});
请注意,我有一个数据共享服务“Data”传递给run方法,用于存储来自api回调的检索项。 对象“Data.customerServerRowObject”由api调用正确设置。另请参阅$ rootScope。$ apply()在回调中调用,以跨越角度应用程序同步对象。现在,每当我尝试在控制器中检索对象“Data.customerServerRowObject”时,我都会得到“未定义”值:
controllers.OrderVarification = function ($scope, Data) {
// ng-model="customerPhonenumber" in the view
$scope.customerPhonenumber = Data.customerServerRowObject.phonenumber;
}
这是因为控制器内的代码在api回调仍未完成时执行。我也在做$ rootSope。$ apply()这对我的运行函数没有影响
答案 0 :(得分:2)
你需要使用promises,你不能只使用$ apply:
来同步转换异步操作myModule.run(function ($rootScope, $localStorage, AzureMobileClient, Data, $q) {
//Return user json object; store it in Data.customerUserJsonObject
var deferred = $q.defer();
Data.customerServerRowObject = deferred.promise;
AzureMobileClient.getCustomerUser(function (item) {
$rootScope.$apply(function () {
deferred.resolve(item);
console.log("rootScope applied");
});
console.log("myModule.run: item >");
console.log(item);}, $localStorage.phonenumber);
});
controllers.OrderVarification = function ($scope, Data) {
// ng-model="customerPhonenumber" in the view
Data.customerServerRowObject.then(function(data){
$scope.customerPhonenumber = data.phonenumber;
});
}