使用$timeout等待服务数据解析
Use $timeout to wait service data resolved
我正在尝试通过服务将数据从指令传递到控制器,我的服务如下所示:
angular
.module('App')
.factory('WizardDataService', WizardDataService);
WizardDataService.$inject = [];
function WizardDataService() {
var wizardFormData = {};
var setWizardData = function (newFormData) {
console.log("wizardFormData: " + JSON.stringify(wizardFormData));
wizardFormData = newFormData;
};
var getWizardData = function () {
return wizardFormData;
};
var resetWizardData = function () {
//To be called when the data stored needs to be discarded
wizardFormData = {};
};
return {
setWizardData: setWizardData,
getWizardData: getWizardData,
resetWizardData: resetWizardData
};
}
但是当我尝试从控制器获取数据时,它没有解决(我认为它等待摘要循环完成),所以我必须在控制器中使用$timeout函数来等待它完成,如下所示:
$timeout(function(){
//any code in here will automatically have an apply run afterwards
vm.getStoredData = WizardDataService.getWizardData();
$scope.$watchCollection(function () {
console.log("getStoredData callback: " + JSON.stringify(vm.getStoredData));
return vm.getStoredData;
}, function () {
});
}, 300);
尽管它有效,但我感兴趣的是,如果有更好的方法来做到这一点,如果这是无错误的和主要问题,为什么我们使用 300 延迟而不是 100(例如)进行$timeout以及它是否总是有效(也许对于某人来说,从服务获取数据花费的时间超过 300 年)。
您可以从服务 get 方法返回承诺。 然后在控制器中,可以提供成功方法来分配结果。 您的服务如下所示:
function getWizardData() {
var deferred = $q.defer();
$http.get("/myserver/getWizardData")
.then(function (results) {
deferred.resolve(results.data);
}),
function () {
deferred.reject();
}
return deferred.promise;
}
在 ng 控制器中,您可以调用您的服务:
wizardService.getWizardData()
.then(function (results) {
$scope.myData = results;
},
function () { });
无需超时。 如果您的服务器是 RESTFULL,则使用 $resource 并直接绑定。
使用 angular.copy
替换数据而不更改对象引用。
function WizardDataService() {
var wizardFormData = {};
var setWizardData = function (newFormData) {
console.log("wizardFormData: " + JSON.stringify(wizardFormData));
angular.copy(newFormData, wizardFormData);
};
从文档中:
角度复制
创建源的深层副本,该副本应为对象或数组。
- 如果提供了目标,则会删除其所有元素(对于数组)或属性(对于对象),然后将源中的所有元素/属性复制到该目标。
用法
angular.copy(source, [destination]);
-- AngularJS angular.copy API 参考
这样,对象引用将保持不变,并且具有该引用的任何客户端都将得到更新。无需在每次更新时获取新的对象引用。
相关文章:
- AngularJS-需要在index.html页面中访问来自服务的数据
- 角度服务未返回数据
- 对视图上函数的角度绑定导致对数据服务的无限调用
- AngularJS中共享数据服务初始化失败
- Angular promise服务作为全局数据服务
- (IONIC)错误: [$injector:unpr] 未知提供程序: 数据服务提供程序 <- 数据服务<- 身份验证控
- 读取数据服务中的参数值
- 数据服务和离子的问题
- 过帐时更改oData条目中的属性.[WCF数据服务+EF+SQL expression]
- Angularjs无法将数据服务响应添加到作用域变量
- WSO2——在jaggery应用程序中调用数据服务
- Angularjs在控制器之间共享数据(服务方式)——不调用监视器
- 处理数据服务或控制器
- JS数据服务加载所有数据或只需要的数据
- 在AngularJS中使用Wcf数据服务
- 具有多个API数据服务的应用程序
- 将Breeze(使用Angular)连接到现有的WCF数据服务
- PhoneGap环境变量与开发环境中的AJAX数据服务有关
- Angular在控制器之间共享数据:服务与事件
- 从 WCF/ADO.NET 数据服务中的请求正文接收参数