在我的AnlgularJS控制器中,我的第一个业务是确定应用程序是在dev中运行还是测试。
对于那个purpoer,我打电话给一个api,一个回答(该部分经过验证可以工作)。
根据环境的不同,我需要设置$ scope.uploadUrl的值,因此我的文件上传器指令会知道要为其文件上传定位哪个url。
出于某种原因,到上传者执行时,该网址值就会丢失。
以下是我的控制器的相关部分:
$scope.uploadUrl = '';
console.log('This is FileUploadController');
function getEnvironment (){
$http.get('/environment').success(function(response) {
$scope.currentEnvironment = response.environment;
if(response.environment === 'test'){
$scope.uploadUrl = 'http://test_url:3001/api/files';
}
if(response.environment === 'dev'){
$scope.uploadUrl = 'http://dev_url:3000/api/files';
}
console.log('Current Environment is: ' + $scope.currentEnvironment
+ ' so the uploadUrl should be: ' + $scope.uploadUrl);
});
}
getEnvironment();
var selectedCategory;
var selectedDataVersion;
var uploader = $scope.uploader = new FileUploader({
//url: 'http://dctool-lnx.cloudapp.net:3001/api/files',
url: $scope.uploadUrl,
tabName: 'sheet1'
});
重构这段代码的正确方法是什么,让我的getEnvironment函数中的值设置得足够长?
答案 0 :(得分:2)
出于某种原因,到上传者执行时,该网址值就会丢失。
不是真的,实际的原因是上传执行的时间,还没有分配url值,因为分配值的操作本质上是异步(AsycJAX)。
所以基本上你需要等待该操作完成,你可以通过利用操作返回的保证来完成。
//return promise from the function
function getEnvironment (){
return $http.get('/environment')....
}
//Make a call chain it through and register runUploader
getEnvironment().then(runUploader);
var selectedCategory;
var selectedDataVersion;
function runUploader(){
var uploader = $scope.uploader = new FileUploader({
//url: 'http://dctool-lnx.cloudapp.net:3001/api/files',
url: $scope.uploadUrl,
tabName: 'sheet1'
});
}
答案 1 :(得分:1)
我不认为你的问题与生命时间有关。我看到的问题是,当你创建你的上传器时,AJAX调用还没有返回。
试试这个:
$scope.uploadUrl = '';
$scope.uploader;
var selectedCategory;
var selectedDataVersion;
var uploader;
console.log('This is FileUploadController');
function initUploader()
{
uploader = $scope.uploader = new FileUploader({
//url: 'http://dctool-lnx.cloudapp.net:3001/api/files',
url: $scope.uploadUrl,
tabName: 'sheet1'
});
}
function getEnvironment (){
$http.get('/environment').success(function(response) {
$scope.currentEnvironment = response.environment;
if(response.environment === 'test'){
$scope.uploadUrl = 'http://test_url:3001/api/files';
}
if(response.environment === 'dev'){
$scope.uploadUrl = 'http://dev_url:3000/api/files';
}
initUploader();
console.log('Current Environment is: ' + $scope.currentEnvironment
+ ' so the uploadUrl should be: ' + $scope.uploadUrl);
});
}
getEnvironment();