AngularJS file upload directive
之前需要在页面里面上传文件,却不知道如何将获取到的文件传给 Angular 的 model,想来想去最合适的还是 用 Angular 的 directive 来实现,写了之后发现很简单,大概就是下面这样。
app.directive 'fileUploader', ['$parse', ($parse) ->
return {
restrict: 'A',
link: (scope, element, attrs) ->
element.bind 'change', ->
input_file = element[0].files[0]
$parse(attrs.fileUploader)
.assign(scope, input_file)
scope.$apply()
}
]
<input type="file" id="file_uploader" file-input="file" />
这里我们定义了一个叫做 fileUploader
的 directive,通过在前端模版中把它和 input 绑定,我们可以
获取到 input 的内容,element[0].files
就是上传的文件(files 是一个数组,也就是说我们还可以用它
来实现多文件上传)。因为我们我们只上传了一个文件,因此上传的文件为 element[0].files[0]
,这里我们
用到了 $parse
这个模块,它用来解析 html。我们这里用它是需要获取到赋值给 file-uploader 的那个 model,
然后在它所在的 scope 内赋值。这样一来,我们的 controller 中的 $scope.file
就成功获取到了上传
的文件的信息。除此之外,我们还可以读取到 file 的很多属性,如 size,type 等等,这为对上传的文件做
更多的限制提供了很多的便利。
后记:开始使用 Angular 的时候会总是用以前写 jQuery 的思维来写 Angular 的代码,所以会觉得用起来 很痛苦。一旦熟悉了 Angular 自己的一些规则,按着它的规则来就会用起来很爽。directive 就 是 Angular 用起来需要适应但是会很爽的东西,它能让我们更好的把 controller 和 views 分离,同时还 有很好的重用性。