Angularjs 指令中接收的范围与指令实际存在的范围不同

Angularjs 指令中接收的范围与指令实际存在的范围不同,angularjs,angular-ui-bootstrap,Angularjs,Angular Ui Bootstrap,我有这个指令,它基本上是通过file model=。。。本指令的全部目的是因为ng模型在angularjs中不起作用 angular.module('myApp').directive('fileModel', ['$parse', function ($parse) { return { restrict: 'A', link: function(scope, element, attrs) { console.log(scop

我有这个指令,它基本上是通过file model=。。。本指令的全部目的是因为ng模型在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:

我从另一个控制器调用模态,如下所示:

$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,
    });

    ...
};
所以。。。如果您注意到以下三条评论:

第一条注释//调试 第二条注释//调试 注释//空! 似乎该指令使用的范围与存在的范围不同,因此我得到一个空文件

我用示波器做错了什么

我还应该提到,这在不使用引导ui模式的情况下运行良好。。。因此,它必须与模态的范围有关,需要测试两件事:

验证是否在指令的事件处理程序之后调用uploadFile函数,因为它们正在侦听同一事件。如果不是,您应该将fileModel指令的优先级提高到大于ngChange的优先级,即0。 尝试使用resolve属性将数据传递到模态,而不是创建新的作用域。根据文档,$modal创建了您传入的子范围,因此您可能会遇到原语值的原型继承问题。
答案如下:var modalScope=$scope.$new$scope.$new创建从$scope继承的新子作用域。所以$scope中的任何内容也应该在modalScope中。但是您是说您从另一个控制器调用了模态。控制器有独立的作用域,所以$scope.excelFile很可能位于modalScope之外的另一个作用域中,对吗?您看到的没错,您试图初始化$scope.input={},但它不起作用?很抱歉,我没有跟踪您。。。但我确实尝试在modalI读取链接的范围内初始化$scope.excelFile,但这里不是这样,因为传递的范围已经初始化。第二个//调试抛出与第一个//调试不同的作用域。所以我的问题不是一个空的或未定义的范围,而是一个不同的范围。关于1:在检查uploadFile方法之前调用了所有的指令代码。关于2:嗯,我会尝试,尽管过去我所有的情态动词都是从父母那里传递一个新的作用域
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,
    });

    ...
};