04.09.2013, 23:21
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от Shitbox2
|
О_о Никогда бы не подумал что кому-нибудь будет нужно
|
я и сам не подумал бы )
Пока не забыл, хочу тут мысль запостить по поводу отправки файлов через $rootScope. Сейчас у меня ситуация такая, директивы ловят файлы и отправляют их в корневой скоп (по твоему совету). Это правильно и удобно, но не позволит создать два экземпляра загрузчика (независимых). Выход - каналы передачи данных. На примере:
<html>
<head>
<script>
app.run(function( $rootScope ) {
$rootScope.$on( 'channel:name1', function() {
// some code
});
$rootScope.$on( 'channel:name2', function() {
// some code
});
});
</script>
</head>
<div>
<div ng-file-drop channel="channel:name1"></div>
</div>
<div>
<div ng-file-drop channel="channel:name2"></div>
</div>
</html>
америку я, конечно, не открыл, но вдруг кому пригодится
Сообщение от Shitbox2
|
Во-первых загрузка одного и того же файла по разным URL в пределах одного сервера — плохое решение
|
не соглашусь
Сообщение от Shitbox2
|
У меня каждой директиве
oi-file="options"
можно задать свой объект с настройками
|
теперь у меня тоже (предыдущий релиз) )
Сообщение от Shitbox2
|
Проблема в том, что при манипуляциях с моделью лезут ошибки именно из-за того, что в модели оказывается ссылка на xhr, а в xhr записана ссылка на модель (циклическая ссылка).
|
теперь понял откуда у меня ошибки лезли
Сообщение от Shitbox2
|
Случайно нигде не видел, чтобы она использовалась))) Более того, в версии 1.2 и из своего кода смог эти проверки выкинуть. Стало и без них работать. (был баг, когда http-запросы копились и уходили не сразу, если цикл не запустить)
|
тоже буду курить в этом направлении, когда время будет. Спасибо
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
29.09.2013, 00:55
|
Профессор
|
|
Регистрация: 04.10.2010
Сообщений: 571
|
|
Не взяли меня фронтендщиком в Яндекс. Ну и ладно, больше времени на открытые проекты останется)
Обновил загрузчик: https://github.com/tamtakoe/oi.file
Переделал загрузку, общий прогресс и проч. Теперь файлы загружаются по-очереди. Для этого пришлось запилить отдельную очередь для загружаемых файлов. Вынеся в эту же очередь ссылки на xhr, избавился от циклических ссылок, что позволило сделать отмену загрузки :-)
Не стал засорять область видимости, поэтому туда копируется только один объект — очередь. Которая содержит как список загружаемых фалов, так и значения общего прогресса, кол-во загруженных байт и т.п.
Теперь новая версия работает только в Ангуляре 1.2. Для старых версий сделал отдельню версию. Там совсем небольшие отличия.
Последний раз редактировалось Shitbox2, 29.09.2013 в 01:02.
|
|
01.10.2013, 20:03
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Shitbox2, не грусти, все будет хорошо
Сообщение от Shitbox2
|
Вынеся в эту же очередь ссылки на xhr, избавился от циклических ссылок, что позволило сделать отмену загрузки :-)
|
немного спогодя спизжу позаимствую у тебя
Сообщение от Shitbox2
|
Теперь файлы загружаются по-очереди
|
все-таки очередь ) Кстати, https://github.com/nervgh/angular-file-upload/issues/5
Сообщение от Shitbox2
|
Не стал засорять область видимости, поэтому туда копируется только один объект — очередь
|
а чем засорял до этого? О_о
https://github.com/tamtakoe/oi.file
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Последний раз редактировалось nerv_, 01.10.2013 в 20:10.
|
|
02.10.2013, 19:52
|
Профессор
|
|
Регистрация: 04.10.2010
Сообщений: 571
|
|
Сообщение от nerv_
|
а чем засорял до этого? О_о
|
Полями progressAll, loadedAll, например. Тут логика такая: В каждый элемент модели (связанный с файлом) мы добавляем кучу полей:
fileName
fileThumb
fileSize
fileLoaded
fileProgress
fileUploading
Это оправдано, т.к. половина из них могут и так содержаться и быть полезными в модели (fileName, fileThumb, fileSize). Остальные просто удаляются после окончания загрузки.
С областью видимости всё не так. Сам по себе контроллер ни с какой моделью не связан и добавляя в область видимости кучу полей мы ее сильно замусориваем. Поэтому тут лучший вариант добавить один параметр — модель очереди загрузки и уже с ней работать.
Цитата:
|
все-таки очередь )
|
Да. Сравнивал скорость. По сути, одна и та же. Только с параллельной загрузкой больше гемора, когда нужно общий прогресс вычислять Еще, если оборвется соединение, то обломается загрузка всех загружающихся файлов. В очереди потеряется только один файл.
Не очень нравится как реализована у меня очередь... С deferred объектами... Думал, этот паттерн поддерживает поочередное выполнение процессов. Похоже, что нет...
|
|
02.10.2013, 23:35
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от Shitbox2
|
Не очень нравится как реализована у меня очередь... С deferred объектами...
|
вот мы и пришли к событиям
Сообщение от Shitbox2
|
Поэтому тут лучший вариант добавить один параметр — модель очереди загрузки и уже с ней работать.
|
я бы все-таки добавлял загрузчик, внутри которого очередь и все остальное
Сообщение от Shitbox2
|
Полями progressAll, loadedAll, например. Тут логика такая: В каждый элемент модели (связанный с файлом) мы добавляем кучу полей:
|
Сообщение от Shitbox2
|
Полями progressAll, loadedAll, например. Тут логика такая: В каждый элемент модели (связанный с файлом) мы добавляем кучу полей:
fileName
fileThumb
fileSize
fileLoaded
fileProgress
fileUploading
|
file.name
file.thumb
file.size
...
Еще у меня есть мысль позаимствовать функции transformResponse для разбора ответа сервера. Что думаешь на этот счет?
Кажется, здесь лежат
$http.defaults.transformResponse
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Последний раз редактировалось nerv_, 03.10.2013 в 00:13.
|
|
03.10.2013, 06:17
|
Профессор
|
|
Регистрация: 04.10.2010
Сообщений: 571
|
|
Сообщение от nerv_
|
вот мы и пришли к событиям
|
Совсем бы не хотелось. События, как мне кажется, это такая штука, которая должна быть связана только с бизнес-логикой, т.е. в основной программе возникают и там же ловятся. Если же каждый плагин будет плодить свои события, можно очень быстро замусорить глобальную область видимости. Если же события будут локальными... Ну и что это за события такие? :-)
----
ИМХО, события нужны для асинхронных вещей: пользователь нажал что-то, кто-то написал в чате и т.п. (мы не создаем запрос). Синхронные вещи — это удел обещаний: запрос к серверу, загрузка файлов (мы создали запрос и ожидаем ответ)
Сообщение от nerv_
|
я бы все-таки добавлял загрузчик, внутри которого очередь и все остальное
|
Типа твоего uploader? Когда дело до оптимизации дойдет, скорее всего придется общий код в прототип выносить и что-то такое делать... Но не понимаю, зачем, вообще, нужно выносить очередь? Сперва думал вынести в область видимости только информацию об общем прогрессе, а очередь вынес скорее из-за свойства queue.length :-). Ну и типа можно полностью перехватить управление и пересортировать ее, чтобы, например сначала загружались самые маленькие файлы или, вообще, компоновать все мелкие файлы и загружать их в одном запросе... Но это такая чушь, что без нее будет только лучше.
Сообщение от nerv_
|
Еще у меня есть мысль позаимствовать функции transformResponse для разбора ответа сервера. Что думаешь на этот счет?
|
Эту, как понимаю
function(data) {
if (isString(data)) {
// strip json vulnerability protection prefix
data = data.replace(PROTECTION_PREFIX, '');
if (JSON_START.test(data) && JSON_END.test(data))
data = fromJson(data);
}
return data;
}
}
У меня подобным занимается функция-обертка над angular.fromJson
function _parseJSON (data) {
if (typeof data !== 'object') {
try {
return angular.fromJson(data);
} catch (e) {
return false;
}
}
return data;
}
}
В принципе, идея здравая. Правда, не знаю, на сколько оправданы все их проверки. И в моем случае я парсю, только если этого не сделал $http, т.е. и так почти всегда использую дефолтный transformResponse.
Последний раз редактировалось Shitbox2, 03.10.2013 в 06:19.
|
|
03.10.2013, 23:39
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от Shitbox2
|
События, как мне кажется
|
не правильно тебе кажется )
Сообщение от Shitbox2
|
Если же каждый плагин будет плодить свои события
|
многие жуквери плагины плодят события
Сообщение от Shitbox2
|
Если же каждый плагин будет плодить свои события, можно очень быстро замусорить глобальную область видимости
|
1. как можно замусорить область видимости событиями?
2.
глобальный_скоп {
scope {
2. тут поймали и остановили (чтобы не дошло до глобального скопа)
scope: {
1. тут запулили событие вверх
}
}
}
Сообщение от Shitbox2
|
У меня подобным занимается функция
|
функции. Их может быть много (согласно ангуляру). Опять-таки, зачем писать свою/свои, если можно воспользоваться тем, что есть (моя логика).
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
05.10.2013, 10:53
|
Профессор
|
|
Регистрация: 04.10.2010
Сообщений: 571
|
|
Цитата:
|
многие жуквери плагины плодят события
|
Думаешь, это идеалогически верный подход? Когда мы не контролируем имена событий, генерируемых плагином и можем случайно получить два события с одинаковым именем из разных источников? Обычно события в жиквери-плагинах имеют вид колбеков (как у меня сделано), либо ограничены только областью видимости плагина и не распространяются вверх $('#pluginTag').on(...)
Цитата:
|
2. тут поймали и остановили
|
Интересно как это делается? Кажется в Ангуляре нет средств для остановки событий, т.е. придется свой костыль писать.
Цитата:
|
Опять-таки, зачем писать свою/свои, если можно воспользоваться тем, что есть (моя логика).
|
Кто ж спорит?)) Пока не представляю как получить ссылку на встроенную функцию с гарантией, что ее никто не переопределит. Второй вопрос, нужны ли такие навороты для загрузки файлов? Там-то универсальная функция. Может быть для загрузки такая и не нужна.
|
|
06.10.2013, 03:27
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от Shitbox2
|
Думаешь, это идеалогически верный подход?
|
зависит от обстоятельств
Сообщение от Shitbox2
|
Когда мы не контролируем имена событий, генерируемых плагином и можем случайно получить два события с одинаковым именем из разных источников?
|
чего? Если мы их сами генерируем, то почему мы "их не контролируем"?
Сообщение от Shitbox2
|
Обычно события в жиквери-плагинах имеют вид колбеков (как у меня сделано), либо ограничены только областью видимости плагина и не распространяются вверх $('#pluginTag').on(...)
|
1. коллбек - это коллбек
2. событие - это событие
что мешает сделать пространство имен для событий? Мне, кстати, надо добавить
Сообщение от Shitbox2
|
Интересно как это делается? Кажется в Ангуляре нет средств для остановки событий, т.е. придется свой костыль писать.
|
event.stopPropagation();
Сообщение от Shitbox2
|
Пока не представляю как получить ссылку на встроенную функцию с гарантией, что ее никто не переопределит.
|
1. функции
2. зачем на одну, если можно на массив функций? (например)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
07.10.2013, 12:44
|
Профессор
|
|
Регистрация: 04.10.2010
Сообщений: 571
|
|
Цитата:
|
Если мы их сами генерируем, то почему мы "их не контролируем"?
|
Они генерируются в недрах плагина, так что кроме тебя их никто не контролирует :-)
Цитата:
|
1. коллбек - это коллбек
2. событие - это событие
|
Любое событие начинается колбеком и заканчивается колбеком)
Цитата:
|
event.stopPropagation();
|
Я невнимательный) Тем не менее, тут палка о двух концах. Вызов функции в $on вызывает цикл дайджест, и он будет вызываться даже для тех событий, которые нам не нужны (мы их просто ловим, чтобы остановить)
Цитата:
|
1. функции
2. зачем на одну, если можно на массив функций? (например)
|
Можно тут подробнее, как бы ты это сделал?
|
|
|
|