Невозможно ограничить многократное выполнение 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 к созданию списка пользователей, например:

[...]
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