使用$ timeout来等待解析的服务数据

时间:2016-01-30 12:58:07

标签: javascript angularjs

我试图通过服务将数据从指令传递给控制器​​,我的服务看起来像这样:

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来从服务中获取数据)。

2 个答案:

答案 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

这样,对象引用保持不变,任何具有该引用的客户端都将更新。每次更新都不需要获取新的对象引用。