【发布时间】:2014-12-01 23:47:52
【问题描述】:
我有这个指令,它基本上通过file-model="..."将文件附加到模型(这个指令的全部目的是因为ng-model在angularjs中的<input type="file">不起作用)
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);
}
});
}
};
}]);
我还有一个 bootstrap-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>
与其对应的 bootstrap-ui 控制器:
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,
});
...
};
所以...如果您注意到三个 cmets:
- 第一条评论
// DEBUG - 第二条评论
// DEBUG - 评论
// empty!
该指令使用的范围似乎与<input type="file"> 所在的范围不同,因此我得到一个空文件。
我在使用范围时做错了什么?
另外我应该提到,这在不使用引导 ui-modal 的情况下工作得很好......所以它必须与模态的范围有关
【问题讨论】:
-
答案在这里:
var modalScope = $scope.$new();。$scope.$new()创建一个继承自$scope的新子作用域。所以$scope中的任何内容都应该在modalScope中。但是您是说您“从另一个控制器调用模态”。控制器有独立的作用域,所以$scope.excelFile很可能在另一个作用域而不是modalScope,对吧? -
你已经看到this related SO post 对了,你尝试初始化
$scope.input={}没有成功? -
对不起,我没有关注你...但我确实尝试在模态范围内初始化 $scope.excelFile
-
我阅读了链接,但这里不是这种情况,因为传递的范围已经初始化。第二个“// DEBUG”抛出与第一个“// DEBUG”不同的范围。所以我的问题不是空或未定义的范围,而是不同的范围。
标签: angularjs angular-ui-bootstrap