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