Не може да се ограничи многократното изпълнение на Ti.App.fireEvent

В моето приложение Ti.App.addEventListener изпълни няколко пъти дори извиквания на fireEvent веднъж.
Не можах да премахна fireEvent. Как да премахнете създаденото fireEvent.

Ето моите примерни файлове:

selectUser.xml

Alloy>
    <NavigationWindow id="selectUserNav" platform="ios">
        <Window id="selectUserWin">
             <Label id="selectUserLabel"/>
             <Label id="userName"/>
        </Window>
    </NavigationWindow>
</Alloy>

selectUser.js

var selectedUser = '';
function  displaySelectedUser(){
    $.selectUserLabel.setText('Select the user');
    $.userName.setText(selectedUser);
}
displaySelectedUser();

$.selectUserWin.addEventListener('open', function() {
    var titleLabel = Ti.UI.createLabel({
        text : 'Select User',

    });
    $.selectUserWin.setTitleControl(titleLabel);
    var leftView = Ti.UI.createView({
    });
    var leftButton = Titanium.UI.createButton({
        backgroundImage : '/left_arrow.png'
    });
    leftView.add(leftButton);
    $.selectUserWin.setLeftNavButton(leftView);
    var rightView = Ti.UI.createView({
    });
    var rightButton = Titanium.UI.createButton({
        backgroundImage : '/right_arrow.png'
    });
    rightView.add(rightButton);
    $.selectUserWin.setRightNavButton(rightView);

    leftButton.addEventListener('click', function(e) {
        $.selectUserNav.close();
    });
    rightButton.addEventListener('click', function(e) {

            Alloy.createController('usersList').getView().open();   
    });
});

Ti.App.addEventListener('username', function(data) {

    Ti.API.info('### selectedUser: '+ data.selectedUserName);
    selectedUser = data.selectedUserName;
    displaySelectedUser();

});

usersList.xml

Alloy>
    <NavigationWindow id="usersListNav" platform="ios">
        <Window id="usersListWin">
            <TableView id="usersDispTable"></TableView>
        </Window>
    </NavigationWindow>
</Alloy>

usersList.js

 var usersTableData = [];
    function userList(){
        for ( i = 0; i < 5; i++) {

                var titleLabel1 = Titanium.UI.createLabel({
                    text :  'srinivas', 
                });
                var userListRow = Ti.UI.createTableViewRow({
                        userName : 'srinivas',
                        height : '40',
                });
                userListRow.add(titleLabel1);
                usersTableData.push(userListRow);

                userListRow.addEventListener('click', function(e) {
                    var selectedArgs = {
                        selectedUserName : e.rowData.userName
                    };
                     Ti.App.fireEvent('username', selectedArgs);
                     $.usersListNav.close();
                });

        }
$.usersDispTable.setData(usersTableData);

    }
    userList();
    $.usersListWin.addEventListener('open', function() {
        var titleLabel = Ti.UI.createLabel({
            text : 'Users List',

        });
        $.usersListWin.setTitleControl(titleLabel);
        var leftView = Ti.UI.createView({
        });
        var leftButton = Titanium.UI.createButton({
            backgroundImage : '/left_arrow.png'
        });
        leftView.add(leftButton);
        $.usersListWin.setLeftNavButton(leftView);

        leftButton.addEventListener('click', function(e) {
            $.usersListNav.close();
        });

    });

person Chanakya    schedule 19.02.2016    source източник


Отговори (1)


съжалявам, но ще отговоря косвено на въпроса ви, защото това, което се опитвате да направите, не е ефективно.

Това, което трябва да направите, е да слушате вашето TableView, а не вашето TableViewRow като примера по-долу:

$.usersDispTable.addEventListener('click',function(e){
    Ti.App.fireEvent('username', e.rowData.username);
}

Между другото, ако трябва да премахнете EventLister, можете да направите следното:

window.addEventListener('click', function foo(e) {
    window.removeEventListener('click', foo);
    [...]
}

--Редактирано (Коментар за отговор)

Това е така, защото създавате Global EventListener Ti.App.addEventListener всеки път, когато selectUser се извика.

Една възможна опция е да обвържете слушателя event към създаването на userList като:

[...]
var userList = Alloy.createController('usersList').getView();
userList.addEventListener('username',function setUsername(username){
    userList.removeEventListener('username',setUsername);
    Ti.API.info('### selectedUser: '+ data.selectedUserName);
    selectedUser = data.selectedUserName;
    displaySelectedUser();
});
userList.open();
[...]
person Victor Casé    schedule 19.02.2016
comment
Всъщност искам да предам избраното потребителско име от контролера на usersList.js към предварително отворения екран, т.е. selectUser.js Когато отворя и двата контролера няколко пъти, обратното в selectUser.js Ti.App.addEventListener се извиква многократно. - person Chanakya; 20.02.2016
comment
fireEvent в usersList.js: userListRow.addEventListener('click', function(e) { var selectedArgs = { selectedUserName: e.rowData.userName}; Ti.App.fireEvent('username', selectedArgs); $.usersListNav.close (}); - person Chanakya; 20.02.2016
comment
EventLister в selectUser.js:(под слушателя, извикан многократно) Ti.App.addEventListener('username', function(data) { Ti.API.info('### selectedUser: '+ data.selectedUserName); selectedUser = data .selectedUserName; displaySelectedUser(}); - person Chanakya; 20.02.2016