Titanium/Alloy/Appclerator: удалить прослушиватель событий из элемента списка

У меня есть ListView примерно так:

<ListView>
    <Templates>
        <ItemTemplate name="example">
            <View id="wrapper" onClick="onClickExampleButton">
                <Label>Click Me</Label>
            </View>
        </ItemTemplate>
    </Templates>

    <ListSection id="ls">
        <ListItem template="example"></ListItem>
        <ListItem template="example"></ListItem>
        <ListItem template="example"></ListItem>
    </ListSection>
</ListView>

Я хочу предотвратить двойной щелчок по функции onClickExampleButton.

Пока в контроллере у меня есть такой код:

function onClickExampleButton(e) {
     var item = $.ls.getItemAt(e.itemIndex);
     // TODO: I want to disable the onClick eventListener here

     someLongAsyncFuncToServer(function() {
         // TODO: I want to re-enable the onClick eventListener here
     })
}

Обычно удаление прослушивателей событий так же просто, как

$.objId.removeEventListener(onClickExampleButton)

и повторно добавить его так же просто, как:

$.objId.addEventListener(onClickExampleButton)

Однако я не уверен, как добиться этого на ListItem


person Yahya Uddin    schedule 21.04.2017    source источник


Ответы (2)


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

Чтобы решить ваш запрос, вы можете безопасно использовать этот код:

function onClickExampleButton(e) {
     var item = $.ls.getItemAt(e.itemIndex);

     // TODO: I want to disable the onClick eventListener here
     e.source.touchEnabled = false;

     someLongAsyncFuncToServer(function() {
         // TODO: I want to re-enable the onClick eventListener here
         e.source.touchEnabled = true;
     })
}

И внесите небольшое изменение в свой XML-код следующим образом:

<ListView>
    <Templates>
        <ItemTemplate name="example">
            <View id="wrapper" onClick="onClickExampleButton">
                <Label touchEnabled="false">Click Me</Label>
            </View>
        </ItemTemplate>
    </Templates>

    <ListSection id="ls">
        <ListItem template="example"></ListItem>
        <ListItem template="example"></ListItem>
        <ListItem template="example"></ListItem>
    </ListSection>
</ListView>

Загвоздка здесь в том, что прежде всего вы устанавливаете touchEnabled = 'false' для метки внутри View (с id = wrapper), это сделает убедитесь, что событие click не будет запущено Label, а будет всплывать и запускаться только родителем.

Далее, в методе события клика вы используете e.source, который теперь является вашим представлением-оболочкой.

Если вы не установили touchEnabled=false для Ярлыка, то e.source также может содержать ссылку Ярлык. Вы можете прочитать больше о всплывающих окнах событий, которые помогут вам понять, как можно эффективно работать с обработкой событий в Titanium.

person Prashant Saini    schedule 22.04.2017

Я бы добавил свойство к объекту и использовал его для определения статуса. Например, установить переменную, когда вы нажимаете кнопку, а затем изменить ее после долгой работы функции Async. Таким образом, если статус работает, то игнорируйте нажатие. Как только он больше не работает, примите щелчок.

person Ray    schedule 21.04.2017