Polymer сам отслеживает (вызывает) Object.observe или вы?
Можно попробовать использовать временный массив, а в конце например через splice закинуть все значения в отслеживаемый массив.
На крайний случай можно заврапить эти методы и оптимизировать вызов handler.
Вот пример на Angular Light, работает без JS и jQuery.
Если нужна более сложная логика то добавьте JS :)
Не стал делать "очистку" параметров, т.к. для этого уже лучше js (контроллер) применить, хотя можно сюда же в шаблон запихать.
Вот вам вопрос чтобы почувствовать: "Зачем вы используете Rails если тоже самое можно сделать и на asm или C? "
"Фреймворки" могут упростить, ускорить разработку. Попробуйте на jQuery сделать такой пример, обратите внимание что такие простые "задачи" можно делать вообще без использования JS-кода (т.е. шаблона достаточно).
Если вопрос "стоит ли изучать" - стоит (если вы делаете что-то серьезное на клиенте).
Вот без JS (на Angular Light) al-click="page='p1'" - при клике устанавливаем переменную. al-css="active: page=='p1'" - Если page=='p1' добавляем класс active (для кнопок) class="{{page}}" - подключаем класс из переменной
Если я правильно понял, то вот пример.
На Angular Light это делается просто - 2 "команды" и без JS:
При клике устанавливаем переменную: al-click="active='A'"
Блок отображается если у active соответствующее значение: al-if="active=='A'"
Если ваш код не вызовет бесконечную рекурсию/циклы, то проблем не будет.
В отличие от $timeout, будет работать быстрее, т.к. с $timeout будет происходить +1 перерисовка, заново запускается $digest, ну и все это откладывается по времени. Хотя в большинстве случаев это все мелочи.
Если track by не указан, значит работает по умолчанию "track by $id(item)" который генерирует "$$hashKey".
Суть в том что Ангуляру нужно как-то сопоставить элемент массива и DOM, в итоге для элемента массива используется какой-то индетификатор (note.id / hashkey / $index / ...), когда массив изменится Ангуляр по этому идентификатору сможет найти соответсвующий DOM для этого элемента массива, если DOM элемент не найден, то считается что элемент массива новый и под него создается свой DOM и scope, которые опять же привязываются к идентификатору.
В итоге, что-бы было минимум перестроений DOM, нужно делать так что-бы идентификаторы сохранялись от $digest до $digest, для этого есть несколько режимов track by.
Гляньте на Angular (Light), с ним пример попроще. al-click="value=!value" - инвертируем value при клике. al-checked="value" - устанавливаем/получаем значение, для checkbox.