如何在AngularJS中正确处理变量范围

时间:2015-06-04 00:59:07

标签: javascript angularjs

在我的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函数中的值设置得足够长?

2 个答案:

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