2015-08-02 2 views
2

Предположим, что я 3 контроллеров, каждый из которых связан с различными <ons-page>:онсэн слушателей навигатор postpush событий в нескольких угловых контроллеров

  • C1 (v1.html), C2 (v2.html), C3 (v3.html)

Я огонь nav.pushPage() от v1.html до v2.html , а затем оттуда до v3.html. Я пытаюсь инициализировать переменные области для C2 и C3, используя postpush прослушиватель событий.

Теперь я смущен, так это размещение nav.on('postpush') прослушивателей событий. Если я поместил его как в C2, так и в C3, то при переходе на v3.html, оба игрока C2 и C3 увольняются. Пройдя некоторые документы и проблемы, это похоже на ожидаемое поведение. Но стоит ли мне беспокоиться об этом?

Я попытался отключить события с помощью метода nav.off('postpush'), на $scope.$on('$destroy') во всех контроллерах, но это, кажется, не работает, так как pushPage() на v1.html не разрушит C1's сферу. Какая работа для этого? Где я должен отключить слушателя?

Сообщите мне, если для этого требуется фрагмент кода, так как все вышеизложенное связано с API onsen, что должно быть вполне понятным.

+1

Если я правильно понял, проблема в том, что вы не можете отличить C2 от «postpush» C1-> C2 и C2-> C3? В этом случае событие 'postpush' имеет свойства« enterPage »и« leavePage », которые могут быть полезны. –

+0

@FranDios Да, я использую эти 2 свойства прямо сейчас. Но предположим, что я привязал контроллеры 'C2' в 2 представлениях. Таким образом, этот контроллер будет создан дважды, таким образом, дважды регистрируя «postpush». Поэтому, когда я нажимаю от 'v2' до' v3', область 'C2' не уничтожается. И затем нажатие от 'v3' до' v4 (C2) 'снова регистрирует область« C2 ». Сейчас у нас есть дубликаты слушателей. Как получить предыдущий? –

+0

@FranDios Я не могу сделать это по размаху, поскольку область страницы «v2» по-прежнему активна. –

ответ

2

postpush прослушиватель событий в AngularJS должен быть установлен с атрибутом ons-postpush, что навигатор и другие компоненты: http://onsen.io/reference/ons-navigator.html#attributes

Он принимает функцию в рамках навигатора и использовать его в качестве слушателя. Таким образом, он будет установлен только один раз, поэтому нет необходимости беспокоиться о том, что многие слушатели уволены одновременно.

В этом прослушивателе вы можете настроить переменные при завершении анимации или что-либо, что вам нужно, а затем получить к ним доступ с контроллеров ons-page. Очень вероятно, что ваши контроллеры ons-page станут дочерьми навигатора, поэтому, возможно, вы можете использовать $parent. Также вы можете запускать вспомогательные события и улавливать их у контролеров страниц или просто использовать службы для совместного использования всего, что вам нужно.

Событие запускается после того, как элемент страницы связан, поэтому я считаю, что контроллер будет инициализирован до того, как событие будет запущено. Вы можете использовать упомянутые выше методы, чтобы «запускать» вашу инициализацию, когда вы хотите (службы, родительский контроллер или под-события).

Возможно onTransitionEnd обратного вызов также может быть полезен для вас: http://onsen.io/reference/ons-navigator.html#method-pushPage

Надеется, что это помогает!

+0

В чем разница в использовании прослушивателя 'onTransitionEnd' и' postpush'? Можно ли их использовать взаимозаменяемо? –

+0

Теперь я использую метод 'onTransitionEnd', чтобы установить некоторые значения в службах для следующей страницы. Но, как вы сказали, следующий контроллер инициализируется до того, как выполняется метод 'onTransitionEnd', и поэтому он не видит изменений, которые будут выполняться' onTransitionEnd'. Я могу сделать это с прослушивателем событий 'prepush'. Но это заставит меня написать все коды в одном контроллере, связанном с моим «навигатором». Есть ли другой способ здесь, чтобы вызвать метод текущего контроллера, прежде чем переходить на другой контроллер? –

+1

Большое спасибо @FranDios за ваш ответ. Это помогло мне. Мое приложение теперь выглядит намного чище после того, как я реорганизовал его, следуя вашим предложениям. Теперь ближе к онсену :) –

Смежные вопросы