Angular.js:从Utility函数获取变量到Controller

时间:2016-08-08 04:26:32

标签: javascript angularjs

我在angular.js应用程序上有一个服务,它在其范围内创建一个变量(filteredDataGlobal)(self),并有另一个函数来返回该变量。

.service('Utilities',function(){
    var self = this;

    self.someFunction = function(){
      ///does calculations then assigns the results in a variable (filteredDataGlobal)
      self.filteredDataGlobal = finalResults;
    }

    self.getFilteredData = function(){
        return self.filteredDataGlobal;
    };

}

问题是self.someFunction需要时间(在http请求之后进行计算),这样当你在具有Utilities服务的控制器中并尝试访问self.filteredDataGlobal变量时,它会& #39;记录为未定义

.controller('MyController', function(Utilities) {

    var self = this;

    self.filteredData = Utilities.getFilteredData();

    console.log(self.filteredData);

})

我将如何观看' for self.filteredDataGlobal在我在控制器中使用它之前在Utilities函数中准备好了吗?

2 个答案:

答案 0 :(得分:0)

我知道有3种方法。

  1. 回调
  2. 承诺(优选的)
  3. 广播和eventHandlers
  4. 1-您将代码放入函数中并将其传递给您的服务,然后在准备好变量时运行该函数。类似的东西:

    .controller(..function(..){
        $scope.callback= function(){
            ....
        }
        someService.someFunction(params, callback);
    })
    

    并在您的服务中:     。服务(...函数(..){         var someVar = value;         打回来();     })

    2-使用promise api将服务中的承诺返回给您的控制器。并使用.done函数知道服务何时返回数据。

    .service(.., ['$q',.., function($q,..){
        var dfd = $q.deffered;
        if(someVar == set)
            dfd.resolve;
        else
            dfd.reject;
        return dfd.promise;
    }])
    

    并且在cotroller中:

    .controller(..function(..){
        someService.someFunction(..).then(function(){
        });
    });
    

    3-创建服务中的事件。并将其广播到rootScope。然后在你的控制器中检查它,看看.on是否发生了特定事件。然后运行控制器代码(使用该变量)。

    .service(..function(..){
        someFunction(){
            $rootScope.someVar = value;
            $rootScope.broadcast('event-name');
        }
    })
    

    并在您的控制器中:

    .controller(..function(..){
        $rootScope.on('event-name', function(events, args){
            //use the variable someVar here.
        }
    })
    

    注意:这不是您可以复制/粘贴和使用的实际代码,它只是为了让您了解它的工作原理。希望它有所帮助:)

答案 1 :(得分:0)

我同意Mridul Kashyap的回答。但是我想在第2点添加一些你可以做的事情:

app.controller("MyController", MyController); 

function MyController($scope, selectedService){
   selectedService.$promise.then(function(data){
  $scope.myData = data; 
  //fill your logic here. 
   }
} 

如果您喜欢这样,那么确保在解析承诺时填写$ scope变量