Titanium / Alloy / Appclerator:从列表项中删除事件侦听器

时间:2017-04-21 14:38:00

标签: titanium appcelerator appcelerator-titanium titanium-alloy appcelerator-alloy

我的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

上实现此目的

2 个答案:

答案 0 :(得分:2)

我相信你可以通过使用element触发的事件的源id来实现这一点。由于事件被冒泡到父层次结构,因此您唯一需要注意的事项是,所以任何子视图也可以调用click事件来为您提供意外的源ID。

要解决您的查询,您可以安全地使用此代码:

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>

这里的问题是,首先你要在 View(带有id =包装)的标签上设置 touchEnabled ='false' ,它将确保Label不会触发click事件,并且会冒泡并放大仅由父母解雇。

接下来就是,在点击事件方法中,您正在使用 e.source ,它现在是您的包装器视图。

如果您未在标签上设置 touchEnabled = false ,则 e.source < / strong>还可以包含标签参考。您可以阅读有关事件冒泡的更多信息,这将有助于您了解如何有效地使用Titanium中的事件处理。

答案 1 :(得分:1)

我会在对象上放置一个属性并使用它来确定状态。例如, 单击按钮后设置变量,然后在长时间运行的异步功能后更改它...这样,如果状态正在运行,则忽略单击。一旦它不再运行,则接受点击。