Pull to refresh

Comments 25

Полезное расширение. Есть маленькое замечание, следующий код избыточен (если defaultValue undefined, то зачем его устанавливать в undefined). Это будет иметь смысл, только если новое значение не будет undefined. Сделать пул-реквест?

defaultValue = typeof defaultValue === 'undefined' ? undefined: defaultValue;
Давайте. Просто делал хотфикс.
Массивы слишком простой тип данных чтобы прикручивать к нему события.
И соглашусь, и нет. К примеру, коллекции в Backbone.Js решают подобные задачи, но код раздут.
Ок, вы можете использовать традиционные массивы и Arr совершенно параллельно, или создание «классов» с интерфейсом похожим на массив запрещено?
Хозяин, как говорится, барин.
Пару моментов:
1. events лучше сделать через объект, а не массив. Во-первых вы не будете бегать по всему массиву евентов при проброске события.
Во вторых, намного проще будет делать отписку, которой сейчас нету.

2. Сейчас у объекта есть лишь одно событие, и в каждом передается тип.
Использование такой конструкции приведет к switch или if else, для разделения событий. Проще сразу бросать событие с нужным именем и обрабатывать его без проверок.

Вот неплохая реализация работы с событиями github.com/Wolfy87/EventEmitter.
Отличные замечания. По 1-му: уже в планах. По 2-му посоветуйте как лучше, мне кажется можно выбрасывать change и тут же insert / remove / update.
Если вы таки будете улучшать обработку событий, то сделайте поддержку handleEvent, чтобы можно было избежать использования функции Function#bind
Arr.js — это «класс», унаследованный от стандартного Array
Только криво (тест), а надо было вот так.
Да, да. Конструктор инициализируется не совсем корректно. Исправим. Спасибо.
Ну и если редактировать массив при помощи `length` или менять значения по индексу, никаких событий не будет. Или например `splice` генерирует только `remove`, хотя сам метод не только удаляет.
Да. И при обычном a[0] = value событий так же не будет. Используйте set(), get(). Удаление splice(), remove().

Нужно доработать splice(). Спасибо.
splice() теперь умеет генерировать change, update, remove (https://github.com/jmas/arr/issues/5).
Учтите, что этот вариант не работает в IE меньше 11го, т.к. в этих IE не поддерживается __proto__
Кстати, целью было поддерживать библиотеку и в IE8+, поэтому для начала попробую корректно применить конструктор Array, в противном случае прийдется написать «похожее» поведение.
Решением для IE может быть копирование всех методов из прототипа в экземпляр в конструкторе CustomArray и в методах «concat», «reverse», «slice», «splice», «sort», «filter», «map». Из минусов можно выделить то, что не будет работать оператор instanceof.
instanceof критически важен. Спасибо за совет, нужно пробовать.
Конструктор теперь проходит тест. Правда логика конструктора != Array.prototype.constructor, что пока выглядит несколько странно. Буду иметь ввиду и подбирать более удачное решение.
Уже поправлено. Традиционный undefined возвращает get().
Считаю, что проще использовать такую конструкцию, где нужно:

var fruits = new Arr('apple', 'orange', 'pineapple');

function refresh(massive) {
// изменение других данных и так далее
// отложенный рендеринг
// автоматическое сохранение данных на сервер
}

fruits.push('banana');
refresh(fruits);

Т.к. в данном случае не нужна постоянно сидящая в памяти «прослушка».
Пример #1: компонент List для пере-рендеринга представления должен знать только о: данных, шаблоне, контейнере (куда вывыодить данные) и когда обновляться. Поэтому я посчитал логичным: инициализировать компонент этими минимально-необходимыми данными, дать интерфейс через который я смогу проще общаться с компонентом (только добавление / обновление / удаление) — проще говоря почти обычный массив. Интервейс работы с более чем одним компонентом теперь черезвычайно прост — добавилось-изменилось-удалилось: прошло обновление во всех компонентах-слушателях.

Пример #2: компонент ServerSync. Использует тот же интерфейс. Выполняет совершенно другие задачи.

В противном случае, необходимо знать какие методы (у каждого компонента) выведены наружу, например List.render(massive), ServerSync.update(massive) создают необходимость каждый раз подсматривать в реализацию (документацию).

Но такой подход — это всегда дело вкуса.
Sign up to leave a comment.

Articles

Change theme settings