代码之家  ›  专栏  ›  技术社区  ›  Mauro

为什么我的AngularJS绑定不总是正确更新?

  •  4
  • Mauro  · 技术社区  · 10 年前

    我正在使用AWS S3创建一个简单的图像上传页面 Danial Farid's ng-file-upload plugin 。它有一个简单的按钮来上传新图像和图像列表。这样地:

    <ul>
        <li ng-repeat="image in product.images">
            <a class="thumbnail" href="{{ image }}" target="_blank">
              <img ng-src="{{ image }}" alt="image">
            </a>
        </li>
        <li>
            <div class="btn-image-upload" 
                ngf-select 
                ngf-change="upload($files)"
                ngf-accept="'image/*'"></div>
        </li>
    </ul>
    

    在我的控制器上:

    $scope.upload = function (files) {
    
        var aws_policy, aws_policy_signature;
    
        if (files && files.length) {
            $http
                .get(API_URL+'/helper/aws_policy')
                .then(function(data) {
                    aws_policy = data.data.policy;
                    aws_policy_signature = data.data.signature;
                    for (var i = 0; i < files.length; i++) {
                        var file = files[i];
                        var key = generate_aws_key() + '.' + file.name.split('.').pop();
                        var base_url = 'https://.../';
    
                        Upload
                        .upload({ ... })
                        .success(function( data, status, headers, config ) {
    
                            console.log($scope.product);
                            $scope.product.images.push( base_url + key );
                            console.log($scope.product);
    
                        });
                    }
                });
        }
    };
    

    文件正在正确上传(我得到一个很好的 204 Success 来自AWS)和两个 console.log($scope.product) 的调用,显示适当的结果(第二个调用的特征是 images 阵列)。

    事情是这样的。这个婴儿在我的发育机器上运行得很好,但是 有时 在临时服务器或生产服务器上,当 $scope.product.images 有时,我的意思是它能做到三分之一。

    总结

    有时 ,仅在我的生产服务器上,当 $scope.product.images 在AngularJS摘要中更新。

    我的编程经验告诉我 有时 在这类问题中不是一个可接受的概念,它必须与 总是 当这个问题出现时,会发生这种情况,但我进行了广泛的调试,未能找到真正的原因。思想?

    1 回复  |  直到 10 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    这很可能是由 looping within asynchronous callbacks :

    你必须冻结 i :

    $scope.upload = function (files) {
    
        var aws_policy, aws_policy_signature;
    
        function upload(index) {
            var file = files[index];
            var key = generate_aws_key() + '.' + file.name.split('.').pop();
            var base_url = 'https://.../';
    
            Upload
            .upload({ ... })
            .success(function( data, status, headers, config ) {
    
                console.log($scope.product);
                $scope.product.images.push( base_url + key );
                console.log($scope.product);
    
            });
        }
    
        if (files && files.length) {
            $http
                .get(API_URL+'/helper/aws_policy')
                .then(function(data) {
                    aws_policy = data.data.policy;
                    aws_policy_signature = data.data.signature;
                    for (var i = 0; i < files.length; i++) {
                        var file = files[i];
                        upload(i);
                    }
                });
        }
    };
    
    推荐文章