Я реализовал директиву filedrop, которая помещает файл в ngModel.
<filedrop data-ng-model="file"></filedrop>
Я использую следующий код в мой контроллер:
$scope.$watch('file', function(newVal, oldVal) {
if (newVal) {
var reader = new FileReader();
reader.onload = function(event) {
$scope.parseFile(newVal);
};
reader.readAsDataURL(newVal);
}
}, false);
В $ scope.parseFile Im фактически разборе XLSX:
$scope.parseFile = function(file) {
xlsxParser.parse(file).then(function(data) {
console.log("Number of columns", data.datasheet[1].length);
console.log("Number of rows", data.datasheet.length);
$scope.validationErrors = [];
$scope.brand = {
items: []
};
$scope.dataItems = [];
$scope.datasheetValidate(data.datasheet, $scope.brand);
$scope.datasheetData(data.datasheet, $scope.dataItems);
if ($scope.validationErrors.length == 0) $scope.validationErrors.push("Nice work, no validation errors");
//$scope.$apply(function(){});
}, function(err) {
console.log('error', err);
});
}
Как вы можете см., я прокомментировал //$scope.$apply(function(){});
в корпусе ....
НО, мне это нужно, чтобы обновить мою веб-страницу с изменениями области (например, показать validationErrors
)
Почему мне нужен $scope.$apply
?
Единственная причина, по которой я вижу, что это произойдет, если 'xlsxParser.parse (файл). Then' не является методом обратного вызова с угловым обещанием. – Chandermani
Ты на самом деле прав. Он использует jQuery. Может потребоваться переписать заимствованный код или принять тот факт, что я должен явно называть заявку :-( –
Отлично, добавив его в качестве ответа, чтобы на вопрос можно было ответить. – Chandermani