簡體   English   中英

將事件偵聽器傳遞給事件偵聽器?

[英]Passing event listener in to event listener?

我有一個從遠程源填充的tableView。 我在每行上動態添加了幾個按鈕,每行的按鈕和內容位於for循環中。 我在按鈕偵聽器中有一個警報對話框偵聽器。 一旦出現此對話框(如果選擇確認(是)),我希望能夠更改按鈕標題。

我收到以下錯誤:

        Uncaught TypeError: Cannot set property 'title' of undefined.

這是錯誤的來源:

        btn[i].title = "Finish" 

抱歉,我目前無法訪問代碼,並且工作量不多,但是任何幫助/想法都將不勝感激...

編輯:

虛擬代碼:

        var btn = new Array();

        btn[i] = Ti.UI.createButton({
            backgroundImage: '/images/button.png',
            title:'Start',
            top: 0,
            left: 0,
            height: '20%',
            width: '20%'
        });

        btn[i].addEventListener('click', function(e){
            var alert = Titanium.UI.createAlertDialog({
                title : 'Dialog',
                message : 'Change Title',
                buttonNames : ['Yes', 'No']
            });
            alert.addEventListener('click', function(e) {
                if(e.index == 0) {
                    btn[i].title = "Finish";
                }
            });
            alert.show();
        });                                         
        tableViewRow.add(btn[i]);

在某個地方有這樣的for循環:

for( i = 0;  i < btn.length;  i++ ) {
    // do stuff with btn[i]
}

更改為:

for( i = 0;  i < btn.length;  i++ ) {
    addButton( btn[i] );
}

function addButton( button ) {
    // do stuff with button
}

addButton()函數的主體將是for循環中的所有代碼,唯一的區別是: btn[i]到處都將其更改為button

通過將此代碼移入函數中,可以創建一個“閉合”,該閉合將根據需要保留button變量的值,這與原始代碼不同,在循環結束后, btn[i]變為無效。

請記住,在設置事件偵聽器的原始代碼完成很久之后才調用事件偵聽器。 如果在事件偵聽器中使用循環索引,則該索引值不是您期望的值。 封蓋以非常干凈和簡單的方式解決此問題。

您在注釋中提到還需要循環索引。 在這種情況下,您可以這樣做:

for( i = 0;  i < btn.length;  i++ ) {
    addButton( i );
}

function addButton( i ) {
    // do stuff with btn[i]
}

實際上,現在您不必更改循環主體/函數主體中的任何代碼。 您仍然可以像以前一樣使用btn[i]

或者,您可以通過以下方式進行操作:

for( i = 0;  i < btn.length;  i++ ) {
    addButton( button, i );
}

function addButton( button, i ) {
    // do stuff with button (instead of btn[i]) and i where needed
}

現在,您可以像在第一個示例中一樣,用button替換addButton()函數內的所有btn[i]引用,並且在需要時仍可以使用i

您正在for循環中在i上創建一個閉包。 當循環退出時,所有創建的函數將在完全相同的var i上有一個閉包,對於所有函數,該值均為“ length”,因此未定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM