我有这条指令,它基本上通过file-model="..."
将文件附加到模型中(此指令的全部目的是因为ng-model
在<input type="file">
中不起作用angularjs)在指令中收到的范围与指令真正生活的范围不一样
angular.module('myApp').directive('fileModel', ['$parse', function ($parse) {
return {
restrict: 'A',
link: function(scope, element, attrs) {
console.log(scope); // DEBUG
var model = $parse(attrs.fileModel);
element.bind('change', function() {
scope.$apply(function() {
model.assign(scope, element[0].files[0]);
});
if (attrs.ngChange) {
scope.$apply(attrs.ngChange);
}
});
}
};
}]);
而且我也有一个引导的UI模式,modal.html:
<div class="modal-body">
<div class="form-group">
<input type="file" file-model="excelFile" ng-model="dummy" ng-change="uploadFile()" />
</div>
</div>
与其对应的引导,UI CONTRO米勒:
angular.module('myApp').controller('modalController', ['$scope', '$modalInstance', '$scope', function ($scope, $modalInstance, $scope) {
$scope.uploadFile = function() {
console.log($scope); // DEBUG
var formData = new FormData();
formData.append('file', $scope.excelFile); // empty!
...
};
}]);
我调用模式从另一个控制器是这样的:
$scope.openModal = function() {
var modalScope = $scope.$new();
modalScope.somePassedData = "I pass data this way";
var modalInstance = $modal.open({
templateUrl: 'views/modal.html',
controller: 'modalController',
scope: modalScope,
});
...
};
所以...如果你注意到了三点意见:
- 首评
// DEBUG
- 二评论
// DEBUG
- 评论
// empty!
看来,由指令使用的范围是不一样的,其中<input type="file">
是生活的范围,也正因为如此,我得到一个空文件。
我在做什么样的范围错误?
而且我应该指出,这个工作得很好,而无需使用引导界面模态...所以它必须有一些与模态
答案在这里:'var modalScope = $ scope。$ new();'。 '$ scope。$ new()'创建一个从'$ scope'继承的新的子范围。因此'$ scope'中的任何内容都应该在'modalScope'中。但是你说你“从另一个控制器调用模态”。控制器具有独立的作用域,所以'$ scope.excelFile'很可能位于另一个作用域而不是'modalScope',对吧? – 2014-10-07 14:32:05
你已经看到[这个相关的SO帖子](http://stackoverflow.com/questions/18716113/scope-issue-in-angularjs-using-angularui-bootstrap-modal?rq=1)正确,你试图初始化'$ scope.input = {}'并且它不起作用? – Michael 2014-10-07 14:32:19
对不起,我没有关注你......但我曾尝试初始化$ scope.excelFile在模态 – sports 2014-10-07 14:40:59