Родительские и дочерние представления связывают события - PullRequest
0 голосов
/ 23 февраля 2012

Мне интересно, где следует устанавливать события в отношениях родитель-ребенок.Это не конкретная проблема, я полагаю, только лучшие практики.Мой конкретный случай:

У меня есть Dropdown, который содержит Button и List.Описывая действие, вы нажимаете кнопку, и появляется список.Вы щелкаете элемент в списке, и этот элемент выбирается, и список исчезает.

Итак, во-первых, поскольку представление инициализировано как Dropdown, человеку, создающему его, не нужнодостичь и разобраться с видом Button или List.Все методы должны вызываться в родительском представлении, а события могут нуждаться в пузыре от дочернего элемента.

Так, например, вместо выполнения: this.dropdown.button.press();, Dropdown предоставляет свой собственный press методкоторый просто вызывает метод нажатия Button.

Когда пользователь нажимает кнопку, Button запускает событие press, которое Dropdown слушает.

onButtonPress : function () {

    if (!this.isExpanded()) {
        this.expand();
    }

    this.trigger('press');
},

И Dropdown вызывает нажатие на себя, так что разработчик может получить событие печати, не доходя до dropdown.button.

Вот где возникает первый вопрос.Должен ли Dropdown развернуться в onButtonPress или onButtonPress просто вызвать нажатие, и затем расширение будет прослушивать собственное press событие Dropdown:

onButtonPress : function () {

    this.trigger('press');
},

onPress : function () {

    if (!this.isExpanded()) {
        this.expand();
    }
},

И затемстановится более сложным, если Dropdown метод expand просто вызовет expand на себе:

expand : function () {

    if (this.isEnabled()) {

        this.setState('expanded', true);

        this.trigger('expand');
    }

    return this;
},

onExpand : function () {

    this.list.show();
},

или это будет show s List:

expand : function () {

    if (this.isEnabled()) {

        this.setState('expanded', true);

        this.list.show();

        this.trigger('expand');
    }

    return this;
},

Полагаю, мне просто интересно узнать, как лучше решить, где связывать события в отношениях родитель / ребенок.Как избежать запутанных ситуаций и, возможно, циклического вызова событий.

У кого-нибудь есть мысли?

1 Ответ

0 голосов
/ 23 февраля 2012

Я бы просто использовал DOM для этого вместо ручного запуска события. Если вы хотите, чтобы событие сначала попало в родительский объект, установите для захвата значение true или false, если вы хотите, чтобы событие всплыло.

это позволяет вызывать обработчик событий во время фазы захвата, поэтому родительские элементы DOM сначала получают событие:

el.bind('someevent', somefunction, true);

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

el.bind('someevent', somefunction, false);

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

...