使rootcope中的函数返回范围

时间:2017-02-05 15:30:21

标签: angularjs rootscope

我已经使用属性创建了一个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函数给我正确的值。但范围正在给我未定义的数据。

为什么会这样?有人帮我提一些建议吗?

2 个答案:

答案 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
   })
});