使函数内的范围成为全局范围

Make a scope inside a function global

我正在尝试访问我的 $rootScope.newBloodneeded 但我无法在函数外部访问它,我尝试了 rootscope 所以我可以将其称为全局但它仍然给我未定义

.controller('editbloodrequestCtrl', function($scope,Bloodrequest,$rootScope,$routeParams) {
$rootScope.newBloodneeded;

Bloodrequest.getBloodrequest($routeParams.id).then(function(data) {
        if (data.data.success) {
            $scope.newBloodneeded = data.data.bloodrequest.blood_component;
            $rootScope.newBloodneeded = $scope.newBloodneeded;
            //gives me output when I console here
        } else {
            app.errorMsg = data.data.message; // Set error message
        }
    });

console.log($rootScope.newBloodneeded); //gives me undefined

}

假设 $rootScope 工作正常,这是一个异步问题,而不是作用域——当你尝试 运行:

console.log($rootScope.newBloodneeded); //gives me undefined

...getBloodRequest不一定写完。您在 then 中设置 $rootScope.newBloodneeded,它在 getBloodRequest 解析后仅 运行,这可能在您的控制台日志完成后很远很远。

Bloodrequest.getBloodrequest($routeParams.id).then(function(data) {
            ...
            $rootScope.newBloodneeded = $scope.newBloodneeded;
            ...

您可以尝试的一个有趣的测试是将控制台日志包装在 setTimeout 很长一段时间(当您 guaranteed/sure 时 getBloodRequest 已经完成)。这应该向您证明时间是问题,而不是函数范围。

基本上:

setTimeout(() => console.log($rootScope.newBloodneeded), 10000000000) // or whatever timing guarantees completion

这里的解决方案是在 .then 中链接任何需要 $rootScope.newBloodneeded 的逻辑。如果这不起作用,您可能想要创建一个可以从其他地方访问的 Promise。 (这超出了这个问题的范围,我们需要更多细节来找出最佳实施方式)。