我有一个页面来跟踪我所在的台球联赛。目前,我对 HTML 进行硬编码并链接到作为项目一部分的文件,以获取我从联赛中获得的每周统计数据 PDF 以及来自上周。我能够让拖放文件上传工作,但我想让组件尽可能可重用。
为此,我创建了一个指令“dropFile”,您将其设置为上传文件的 URL。这个想法是文件上传例程将调用另一个属性中指定的函数,'on-file-uploaded' 并将它传递给它file
,这是原始删除的文件对象,为 responseText、完成标志和错误标志添加了属性。文件上传会将文件存储在数据库中,并返回带有 ID、MD5 哈希值和其他属性的 JSON。of pool将week
存储这些文件的哈希值并显示指向 MVC 操作的链接,该操作将从数据库中返回文件。这是我设想的 HTML 外观:
<div drop-file="/fileupload"
on-file-uploaded="gotStats"
ng-hide="week.statsHash">
DROP STATS
</div>
<div ng-show="week.statsHash">
<a href="/files/{{week.statsHash}}">Stats</a>
</div>
<div drop-file="/fileupload"
on-file-uploaded="gotScores"
ng-hide="week.scoresHash">
DROP SCORES
</div>
<div ng-show="week.scoresHash">
<a href="/files/{{week.scoresHash}}">Scores</a>
</div>
这样,我必须在我的控制器上创建两个方法,gotStats
and gotScores
,这将被调用并更新statsHash
and scoresHash
。为简单起见,此处省略了错误检查:
$scope.gotStats = function(file) {
var response = JSON.parse(file.responseText);
$scope.week.statsHash = response.hash;
};
$scope.gotScores = function(file) {
var response = JSON.parse(file.responseText);
$scope.week.scoresHash = response.hash;
};
这是实现我想要的最佳方式吗?我可以从指令中发出一个fileUploaded
事件,这将允许我传递文件和其他参数并访问指令的范围,对吗?只是给函数命名似乎有点奇怪on-file-uploaded
,有没有更好的方法?我将其用作隔离范围的一部分:
scope: {
allowMultiple: "=",
uploadCompleteMethod: "&onFileUploaded"
},
并这样称呼它:
var func = scope.uploadCompleteMethod();
if (func)
func(file);
ng-hide
此外,由于我有一个孤立的范围,当分数上传完成后,我似乎无法隐藏下拉框......
我喜欢指令的概念,因为您可以将它放在一个元素上以接受拖放文件上传,然后您可以在元素内使用 HTML 对其进行样式设置并显示上传进度,但有更好的方法吗?