2015-11-23 78 views
1

我想在控制器功能之外使用single_video變量。它在第一個控制檯日誌中打印良好。但是它給出了single_video是第二個console.log中的未定義錯誤,它在控制器函數之外。由於異步性。如何從angularjs異步調用定義一個全局變量?

var single_video; 
var app = angular.module('myApp', []); 
app.controller('randomVideo', function($scope, $http) { 
    var onSuccess = function(response){ 
     $scope.video = response.data; 
     single_video = $scope.video; 
     //First console.log 
     console.log('1st ID='+single_video.yt_id); 
    }; 
    var onError = function(reason){ 
     $scope.error = "There is an error about getting random_video.php"; 
    }; 
    $http.get("http://www.ytmdb.com/ytvideo/api/random_video.php") 
    .then(onSuccess, onError); 
}); 
//Second console.log 
console.log('2nd ID='+single_video.yt_id); 
+0

你打成什麼作爲*「第二console.log「*實際上是第一個console.log。你所要求的是根本不可能的。 「second」console.log將永遠無法爲您提供該值。 –

+0

@KevinB他們是一樣的,但我得到了第二個「未定義」的錯誤。第二個console.log在single_video由於異步定義之前打印。有沒有辦法使用回調函數等等。我的jacascript背景非常差。 – Tahtakafa

+1

在回調運行後,您必須訪問全局變量**。因此,訪問全局變量的代碼必須位於回調中或從回調中調用。但是,現在不需要全局變量了。 –

回答

1

您可以創建你的success回調傳遞您的變量作爲參數傳遞給函數中調用一個函數:

var app = angular.module('myApp', []); 
app.controller('randomVideo', function($scope, $http) { 
    var onSuccess = function(response){ 
     $scope.video = response.data; 
     single_video = $scope.video; 
     //First console.log 
     console.log('1st ID='+single_video.yt_id); 
     test(single_video.yt_id); 
    }; 
    var onError = function(reason){ 
     $scope.error = "There is an error about getting random_video.php"; 
    }; 
    $http.get("http://www.ytmdb.com/ytvideo/api/random_video.php") 
    .then(onSuccess, onError); 
}); 
function test(a) 
{ 
    console.log('2nd ID='+a); 
} 
+0

如果你在嚴格模式下定義你的控制器(你應該是!),這是行不通的。 –

1

定義你的全局變量在工廠服務和注入服務的角度控制器,無論你需要什麼。 (注意:儘量把一切都放在一個IIFE)

使用服務的全局變量,這裏有一個例子:

var myApp = angular.module('myApp',[]); 
myApp.factory('MySvc', function() { 
return { 
    name : 'your name' 
}; 
}); 

,並在控制器:

function MyCtrl($scope, MySvc) { 
$scope.name = MySvc.name; 
}