有一些“状态”页面上,我要设置延迟,一些文件上传完成后,意味着元素。当然,这对于jQuery选择器来说非常简单,但我如何以“Angular方式”来做到这一点?AngularJS如何延迟绑定元素
这里有个技巧:上传文件的数量可以是1到X,所以这些'状态'跨越(上传完成后要填充文本)每个都需要引用数组中的项目。
我已经尝试了一些东西,我不能使它发挥作用。
难道我的问题有意义吗?
有一些“状态”页面上,我要设置延迟,一些文件上传完成后,意味着元素。当然,这对于jQuery选择器来说非常简单,但我如何以“Angular方式”来做到这一点?AngularJS如何延迟绑定元素
这里有个技巧:上传文件的数量可以是1到X,所以这些'状态'跨越(上传完成后要填充文本)每个都需要引用数组中的项目。
我已经尝试了一些东西,我不能使它发挥作用。
难道我的问题有意义吗?
这里是我的解决方案。要实施您需要访问Github并下载并安装angular-file-upload.js。 谢谢danialfarid这个伟大的Angular文件上传工具!
这里是我查看HTML ...
<div>
<b>Select one or many files by holding [Ctrl] when clicking name:</b>
<br/>
<input type="file" ng-file-select="onFileSelect($files)" multiple>
<br/><br/>
<b>Selected File(s):</b>
<ol ng-bind-html-unsafe="filesSelected()"></ol>
<br/>
</div>
这里是我的(相关部分)控制器....
angular.module('myApp.controllers', [])
.controller('PhotoCtrl', ['$scope','$http', function($scope,$http) {
$scope.selectedFiles = [];
$scope.onFileSelect = function ($files) {
$scope.selectedFiles = $files;
for (var i = 0; i < $files.length; i++) {
var $file = $files[i];
$http.uploadFile({
url: 'server/PhotoUpload.php',
data: {"fileIdx": i},
file: $file
}).success(function (data, status, headers, config) {
var selector = ".status-" + config.data.fileIdx;
var elem = angular.element(document.querySelector(selector));
var status = "";
if (data.ok == "true") {
elem.addClass('bold green');
status = "[ OK ]";
} else {
elem.addClass('bold red');
status = "[ " + data.error + " ]";
}
elem.html(" " + status);
// to fix IE not refreshing the model
if (!$scope.$$phase) $scope.$apply();
});
}
};
$scope.filesSelected = function() {
var html = "";
for (var x = 0; x < $scope.selectedFiles.length; x++) {
var file = $scope.selectedFiles[x];
status = '<span class="status-' + x + '"></span>';
html += "<li><span>" + file.name + "/size: " + file.size + "B/type: " + file.type + "</span>" + status + "</li>";
}
return html;
};
}]);
我连接控制器在routeprovider中。还请注意行url: 'server/PhotoUpload.php'
。您需要Google获取PHP(或者,如果您知道如何使用node.js,现在PHP对我来说更容易),以实际接收上传的文件并将其写入磁盘。
不要忘了把bold, green and red
类在你的CSS文件。
这里的有点诡计是在$ http promise成功代码中。它接收每个文件上传的状态,然后在每个编号的选定文件旁边设置绿色/红色状态消息。它工作得很好。我可能很快会做两个增强:1)显示状态图标与状态文本和...2)我要将文件上传为CouchDB附件,而不是写入磁盘文件夹。我现在开始#2!
而且“是”我确实知道从控制器更新DOM不是“角度方式”,但是没有其他方式来执行此延迟文件上传状态显示。不是我已经知道了。 请纠正我,如果我错了;-)如果你能提出任何改进,我会非常高兴,如果你发布他们:-)
您仍然可以使用jQuery选择在角唯一的真正的规则是你不这样做DOM操作地方,但自定义指令。这不是完全清楚你想要做什么,但如果你需要直接操作DOM,不能与纳克级或NG-显示/隐藏或其他一些内置的指令实现它,那么你可能需要一个定制指令。
写他们喜欢
angular.module("myModule", []).directive("myAwesomeDirective", [function(){
return {
restrict:'E', //could be E = element, C = class, A = attribute
scope: {incomingData:"="},
link:function(scope,iElem,iAttrs) {
//this function called for each instance of the directive
//do your DOM manipulation here
scope.$watch(function() {return scope.incomingData}, function(newVal,oldVal) {
console.log(newVal);
}, true)
}
}
}]).controller("MyCtrl", ["$scope", function($scope) {
$scope.someArray = [1,2,3,4];
$scope.addElement = function() {
$scope.someArray.push(Math.floor(10*Math.random()));
}
}]);
使用像
<div ng-app="myModule" ng-controller="MyCtrl">
<button ng-click="addElement()">Add random</button>
test
{{someArray}}
<my-awesome-directive incoming-data="someArray"></my-awesome-directive>
</div>
查看更多在这里:http://docs.angularjs.org/guide/directive 或http://www.egghead.io
如果这没有帮助试图表现出一些代码,或只是更多地解释你曾经尝试过什么,以及什么不按预期工作。
编辑
更新,包括一些东西结合传入的参数,将尝试建立它小提琴。
shaunhusain:感谢您的答复!对此,我真的非常感激。我完全理解自定义指令,但是只有在视图加载时才调用它们并更新dom。在文件上传完成后,我需要延迟更新dom。有什么方法可以使元素重新绑定?跟随? – Locohost
如果这是你要做的事情,你可以使用$ timeout在一个时间间隔上做些事情。我认为一般情况是你创建了一个指令,并且你使用“隔离范围”将指令绑定到某些数据上,检查出它们非常好的egghead.io视频。基本上你可以传入数组并在链接函数中设置一个监视器,所以当数组改变时触发一个函数调用。 – shaunhusain
也没有问题我最近忘记承认谢谢,但不意味着无礼,我也学习,教学往往是我学习的最佳途径之一,所以希望我可以帮助你这里。 – shaunhusain