我在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函数中准备好了吗?
答案 0 :(得分:0)
我知道有3种方法。
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变量