Цитата:
Он еще внутри используется: аккумулирует события и перераспределяет их (aka proxy). Скорее всего создам для этого изолированный scope, чтобы с ним можно было работать подобным образом (on, off, fire). Еще было бы неплохо внедрение в scope контроллера сделать, чтобы обертки не писать. |
|
Странное вынесение колбэков. Почему не сделать так?
var uploader = $fileUploader.create({
url: '/upload.php',
filters: [
function( item ) { // first user filter
console.log( 'filter1' );
return true;
}
],
//Колбэки
afteraddingfile: function () { ... },
afteraddingall: function () { ... },
...
});
Распространенная практика упаковывать колбэки в объект настроек, чтобы всё было в одном месте. Вынесение АПИ в отдельный объект применяется, как правило, для методов, т. к. методы как раз приходится вызывать из разных мест, напр.: uploader.send() |
Цитата:
// create a uploader with options
var uploader = $fileUploader.create({
url: '/upload.php',
filters: [
function( item ) { // first user filter
console.log( 'filter1' );
return true;
}
]
});
// REGISTER HANDLERS
uploader.bind( 'afteraddingfile', function( event, item ) {
console.log( 'After adding a file 1', item );
});
uploader.bind( 'afteraddingfile', function( event, item ) {
console.log( 'After adding a file 2', item );
});
|
А зачем?)
P.S. И еще не очень с очередью понятно. К примеру, у меня, как помнишь, так:
create: function (file, uploadFile) {
//Создаем пустой элемент для будущего файла
$scope.add('after', function (index, fileEl, permit) {
angular.extend(fileEl, file) //Записываем айдишник элемента в объект файла
uploadFile($scope.url + '/' + fileEl.id, fileEl, permit) //Загружаем файл
})
Т.е. fileEl (надо будет переименовать в queue :) содержит информацию об выбранных файлах. Это массив и его можно менять как угодно стандартными методами. Зачем делать очередь с отдельными методами добавления, доступа? |
Цитата:
Цитата:
$scope.uploader = uploader; где шаблон
<ul>
<li ng-repeat="item in uploader.queue">
</ul>
подробнее в разметке Методов доступа к ней не писал (предполагается использование стандартных способов работы с массивами). Есть метод добавления в очередь, удаления из нее (методы загрузчика). Метод addToQueue нужен потому, что: - перед добавлением в очередь, каждый элемент проходит фильтры (что позволяет валидировать очередь) ссылка - после добавления элемента[file|input] в очередь, он становится элементом очереди (приобретает свое api), что позволяет писать разметку вида
<ul>
<li ng-repeat="item in uploader.queue">
<div>Name: {{ item.file.name }}</div>
<div>Size: {{ item.file.size }}</div>
<div>
Progress: {{ item.progress }}
<div class="item-progress-box">
<div class="item-progress" ng-style="{ 'width': item.progress + '%' }"></div>
</div>
</div>
<div>Uploaded: {{ item.isUploaded }}</div>
<div>
<a ng-href="#" ng-click="item.upload()" ng-hide="item.isUploaded" >upload</a>
<a ng-href="#" ng-click="item.remove()">delete</a>
</div>
</li>
</ul>
- вызываются события "afteraddingfile", "afteraddingall", "changedqueue". На примере события "afteraddingfile" покажу процесс кастомизации:
uploader.bind( 'afteraddingfile', function( event, item ) {
// здесь, например, можно менять свойства элемента очереди, такие как alias, url, headers ... etc
// можно дать команду на немедленную загрузку - item.upload()
// или удалить item.remove() и т.п.
});
- на этапе добавления в очередь убираются браузерные различия (xh2 & iframe): item.upload(); uploader.uploadItem( [index|item] ); uploader.uploadAll( [index|item] ); - почему надо делать удаление через методы загрузчика - iframe transport (остаются скрытые инпуты, формы и фреймы) возможно, сделаю очередь защищенным свойством и добавлю пару методов для феншуя, но особых проблем не вижу, если руки прямые :) |
А ты тестировал iframe? Пытаюсь так же добавить поддержку, твой код не работает. В Хроме выдает ответ в модальном окне (с адресом запроса) с ошибкой UPLOAD_ERR_NO_FILE ПХП загрузчика. В IE просто не работает)
|
Цитата:
Цитата:
чтобы протестировать мой код с фреймовым загрузчиком, достаточно сделать это (разумеется выбирать через инпут)
// It is attached to <input type="file" /> element
.directive( 'ngFileSelect', function() {
return {
link: function( $scope, $element ) {
if ( !window.File || !window.FormData ) {
$element.removeAttr( 'multiple' );
}
$element.bind( 'change', function() {
$scope.$emit( 'file:add', this );
// $scope.$emit( 'file:add', this.files ? this.files : this );
});
}
}
});
|
Я тестировал так: http://learn.javascript.ru/play/GLyoJ
Изменения с 255 строки в files.js |
Цитата:
|
| Часовой пояс GMT +3, время: 04:00. |