我已经使用属性创建了一个rootcope函数。它从数据库获取一些数据。
我想在控制器中使用这个rootcope函数,并将数据放入变量中。
$rootScope.get_option = function(option_name){
$http.post("server/read.php",{'subject': "options", "args": option_name })
.success(function (response) {
console.log(response);
$rootScope.option_get_value = response;
});
if($rootScope.option_get_value){
return $rootScope.option_get_value;
}
}
这就是我在控制器中拥有的东西
$scope.subscription.reduced_hourrate = $rootScope.get_option('verlaagd_tarief');
console.log($scope.subscription.reduced_hourrate);
当我运行脚本时,我在日志中看到$ rootScope函数给我正确的值。但范围正在给我未定义的数据。
为什么会这样?有人帮我提一些建议吗?
答案 0 :(得分:1)
$rootScope.get_option = function(option_name){
return $http.post("server/read.php",{'subject': "options", "args": option_name })
.success(function (response) {
console.log(response);
if(response){
return response;
}
});
}
当你打电话给$ http.post时,成功会在调用if行之后返回一段时间,这就是为什么你得到" undefined",因为响应没有' ;回来用数据来填充$ rootScope.option_get_value。 您正在使用" .success" ($ http:https://docs.angularjs.org/api/ng/service/ $ http内的承诺, 当你将你的回报移动到承诺时,它只会在响应可用时启动。
在控制台中,您可以看到响应中的完整数据,因为控制台正在通过引用工作,这意味着...当您单击日志打开obj时,返回已经返回并且它正在引用数据到控制台。
答案 1 :(得分:0)
$http
进行异步调用。这意味着在解析http成功函数之前调用if
语句if($rootScope.option_get_value) ...
。
为了让它成功,你可以这样做
$rootScope.get_option = function(option_name){
return $http.post("server/read.php",{'subject': "options", "args": option_name })
}
然后在你的控制器里面
$rootScope.get_option('verlaagd_tarief').success(function (response) {
$rootScope.option_get_value = response;
});
但我不确定这是将数据传递给控制器的最佳方式。
一种常见的方法是使用services
。不使用$rootScope
以下是如何使用服务将数据传递给控制器的示例。
var app = angular.module('myApp', []);
//declare a service that make the http calls
myApp.factory('myHttpService', function($scope, $http) {
//return the public API
return {
//use a callback function to return
//the result when the promise is resolved
get_option : function(option_name, fct){
$http.post("server/read.php",
{
"subject": "options",
"args": option_name
}
).then(function(result){
fct(result) //calling the callback when the promise is resolved to return the result
})
}
});
// the controller using myHttpService
myApp.controller('myCtrl', function($scope, myHttpService) {
myHttpService.getOption('verlaagd_tarief', function(result){
$scope.option_get_value = result
})
});