【问题标题】:Scope received in directive is not the same as the scope where directive really lives指令中收到的范围与指令实际存在的范围不同
【发布时间】: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:

  1. 第一条评论// DEBUG
  2. 第二条评论// DEBUG
  3. 评论// empty!

该指令使用的范围似乎与&lt;input type="file"&gt; 所在的范围不同,因此我得到一个空文件。

我在使用范围时做错了什么?

另外我应该提到,这在不使用引导 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


【解决方案1】:

要测试的两件事:

  1. 验证您的uploadFile 函数是否在 指令的事件处理程序之后调用(因为它们正在侦听相同的事件)。如果不是,则应将fileModel 指令的优先级提高到大于ngChange 的优先级(即0)。
  2. 尝试使用resolve 属性将数据传递到您的模式,而不是创建一个新范围。根据文档,$modal 创建了您传入的子范围,因此您可能会遇到原始值的原型继承问题。

【讨论】:

  • 关于 (1):所有指令代码都在 uploadFile() 方法之前被调用(选中)。关于(2):嗯,我会尝试,尽管过去我所有的模态我一直在从父母那里传递一个新的范围
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 2014-11-24
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多