2014-10-07 64 views
0

我有这条指令,它基本上通过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, 
    }); 

    ... 
}; 

所以...如果你注意到了三点意见:

  1. 首评// DEBUG
  2. 二评论// DEBUG
  3. 评论// empty!

看来,由指令使用的范围是不一样的,其中<input type="file">是生活的范围,也正因为如此,我得到一个空文件。

我在做什么样的范围错误?

而且我应该指出,这个工作得很好,而无需使用引导界面模态...所以它必须有一些与模态

+0

答案在这里:'var modalScope = $ scope。$ new();'。 '$ scope。$ new()'创建一个从'$ scope'继承的新的子范围。因此'$ scope'中的任何内容都应该在'modalScope'中。但是你说你“从另一个控制器调用模态”。控制器具有独立的作用域,所以'$ scope.excelFile'很可能位于另一个作用域而不是'modalScope',对吧? – 2014-10-07 14:32:05

+0

你已经看到[这个相关的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

+0

对不起,我没有关注你......但我曾尝试初始化$ scope.excelFile在模态 – sports 2014-10-07 14:40:59

回答

0

两件事情的范围做测试:

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

关于(1):在uploadFile()方法(选中)之前调用所有指令代码。关于(2):嗯,我会尝试,即使对于我过去的所有模式,我已经从父母传递一个新的范围 – sports 2014-10-07 18:35:58