我试图通过服务将数据从指令传递给控制器,我的服务看起来像这样:
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);
尽管它有效,但我感兴趣的是,如果有更好的方法可以做到这一点,如果这是无bug和主要问题,为什么我们使用300延迟而不是100(例如)对于$ timeout,如果它总能工作(可能对某人花费的时间超过300来从服务中获取数据)。
答案 0 :(得分:0)
您可以从服务获取方法返回承诺。然后在控制器中,您可以提供成功方法来分配结果。您的服务将如下所示:
function getWizardData() {
var deferred = $q.defer();
$http.get("/myserver/getWizardData")
.then(function (results) {
deferred.resolve(results.data);
}),
function () {
deferred.reject();
}
return deferred.promise;
}
在您的ng-controller中,您可以致电您的服务:
wizardService.getWizardData()
.then(function (results) {
$scope.myData = results;
},
function () { });
不需要超时。如果您的服务器是RESTFULL,那么使用$ resource并直接绑定。
答案 1 :(得分:0)
使用Media source = new Media(file.toURI().toString());
替换数据而不更改对象引用。
angular.copy
来自文档:
angular.copy
创建源的深层副本,该副本应该是对象或数组。
- 如果提供了目标,则会删除其所有元素(对于数组)或属性(对象),然后将源中的所有元素/属性复制到该目标。
用法
function WizardDataService() { var wizardFormData = {}; var setWizardData = function (newFormData) { console.log("wizardFormData: " + JSON.stringify(wizardFormData)); angular.copy(newFormData, wizardFormData); };
- AngularJS angular.copy API Reference
这样,对象引用保持不变,任何具有该引用的客户端都将更新。每次更新都不需要获取新的对象引用。