Unable to restrict the Ti.App.fireEvent execute multiple time

175 Views Asked by At

In my app Ti.App.addEventListener executed multiple times even fireEvent calls one time.
I was unable to remove the fireEvent. How to remove the created fireEvent.

Here is my sample files:

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();
        });

    });
1

There are 1 best solutions below

3
On

sorry but I will answer your question indirectly, because what you are trying to do isn't efficient.

What you need to do is to listen your TableView not your TableViewRow like example below:

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

By the way, if you need to remove an EventLister you can do like this:

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

--Edited (Answer comment)

That is because you are creating a Global EventListener Ti.App.addEventListener every time selectUser is called.

One possible option is to bind the event listener to userList creation like:

[...]
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();
[...]