Javascript $scope.$apply()在角度加工中,但抛出错误

Javascript $scope.$apply()在角度加工中,但抛出错误,javascript,angularjs,Javascript,Angularjs,我将单独的示例放在一个jsbin中: 场景 基本上,这个想法很简单。单击按钮,控制器将添加到模型中,视图将相应地更新为隐藏的输入type=“file”。更新视图后,控制器单击最后添加的文件输入 问题 当控制器在运行$scope.$apply()之前单击文件输入时,在第二次单击之前不会发生任何事情,可能是因为angular尚未注册新输入。 当我运行$scope.$apply()时,控制台抛出错误,但确实单击了输入 以下是html: angular是全新的,因此请原谅任何noooobish设计缺

我将单独的示例放在一个jsbin中:

场景 基本上,这个想法很简单。单击按钮,控制器将添加到模型中,视图将相应地更新为隐藏的输入type=“file”。更新视图后,控制器单击最后添加的文件输入

问题 当控制器在运行$scope.$apply()之前单击文件输入时,在第二次单击之前不会发生任何事情,可能是因为angular尚未注册新输入。 当我运行$scope.$apply()时,控制台抛出错误,但确实单击了输入

以下是html:

angular是全新的,因此请原谅任何noooobish设计缺陷,因为
$scope.$apply()
触发
$digest
,在angular中,任何时间点只能有一个
$digest
$apply
操作正在进行

你应该使用


注意:您应该在控制器中注入$timeout。

我将使用
$timeout

var myApp = angular.module('myApp', []);
myApp.controller('fileButtons', ['$scope', '$log','$timeout', function($scope, $log, $timeout)
{
    $scope.files = [];
    $scope.handleImage = {
      add: function()
      {
        $scope.files.push({state : 'started'});
        $log.log('added');
        $timeout(function()
        {
          angular.element('.imageUploadPreviewContainer .imageUploadPreview:last input[type=file]').trigger('click')
        },0);
      }
    };
  }
]);

因此,当您第一次单击该按钮时,会出现一个“打开文件”对话框?。如果不使用$apply,该对话框不会出现?我明白了吗?没有必要在100毫秒内超时。啊。。。我不知道angular自定义setTimeout函数。我试着用香草超时,但没用。谢谢,这已经奏效了。是的,伙计,当我开始使用angular时,我也遇到了同样的问题。仍然使用vanilla js,我经常发现自己非常想使用
$timeout
:)ta。我想我一定试过无数种不同的方法来让这玩意儿发挥作用哈哈
 var myApp = angular.module('myApp', []);
myApp.controller('fileButtons', ['$scope', '$log',
    function($scope, $log){
        $scope.files = [];
        $scope.handleImage = {
            add: function(){
              $scope.files.push({
                state : 'started'
              });
              $log.log('added');
              $scope.$apply(); 
              angular.element('.imageUploadPreviewContainer .imageUploadPreview:last input[type=file]').trigger('click')
            }
        }
    }
]);
 $timeout(function(){
   angular.element('.imageUploadPreviewContainer .imageUploadPreview:last input[type=file]').trigger('click')
 }, 0) 
var myApp = angular.module('myApp', []);
myApp.controller('fileButtons', ['$scope', '$log','$timeout', function($scope, $log, $timeout)
{
    $scope.files = [];
    $scope.handleImage = {
      add: function()
      {
        $scope.files.push({state : 'started'});
        $log.log('added');
        $timeout(function()
        {
          angular.element('.imageUploadPreviewContainer .imageUploadPreview:last input[type=file]').trigger('click')
        },0);
      }
    };
  }
]);