Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Сделать ns.Events консистентнее с jQuery Events #613

Open
chestozo opened this issue Jul 14, 2016 · 12 comments
Open

Сделать ns.Events консистентнее с jQuery Events #613

chestozo opened this issue Jul 14, 2016 · 12 comments

Comments

@chestozo
Copy link
Member

По следам #607

Хочется сделать ns.Events максимально консистентным с jquery.
К примеру:
ns.Events:

var hhh = function() { console.log(+ new Date()); };
ns.MAIN_VIEW.once('click', hhh);
ns.MAIN_VIEW.on('click', hhh);

ns.MAIN_VIEW.off('click', hhh);

console.log('1st');
ns.MAIN_VIEW.trigger('click')

console.log('2nd');
ns.MAIN_VIEW.trigger('click')

// 1st
// 1468485180585
// 2nd

jQuery:

var $body = $(document.body);
var hhh = function() { console.log(+ new Date()); };
$body.one('click', hhh);
$body.on('click', hhh);

$body.off('click', hhh);

console.log('1st');
$body.trigger('click')

console.log('2nd');
$body.trigger('click')

// 1st
// 2nd
@iEgit
Copy link
Collaborator

iEgit commented Jul 14, 2016

А точно после console.log('2nd'); не будет залогировано время?

@vitkarpov
Copy link
Member

vitkarpov commented Jul 14, 2016

А точно после console.log('2nd'); не будет залогировано время?

Ну вот jQuery как раз снимает оба обработчика. Т.е. если несколько ссылок на один и тот же обработчик — он найдет их все и удалит, а у нас в ns.Events нашли в массиве первую ссылку, удалили и успокоились.

@chestozo
Copy link
Member Author

А точно после console.log('2nd'); не будет залогировано время?

"примеры кликабельны" ;)

@iEgit
Copy link
Collaborator

iEgit commented Jul 14, 2016

В новой версии(0.8.6) снимется только once. А обработчик on останется.

@iEgit
Copy link
Collaborator

iEgit commented Jul 14, 2016

Мне кажется, что $body.off('click', hhh);, который снимает сразу два обработчика - это не лучшее решение jQuery, и не стоит быть в этом месте с ними заодно. А что, если я хочу снять только один обработчик?

@vitkarpov
Copy link
Member

не стоит быть в этом месте с ними заодно

Мы просто не может быть незаодно, потому что jQuery переписать нельзя, а ns.Events можно. Речь ж о том, чтобы они были совместимы, потому что мы пользуем и тот и тот — в принципе, есть шанс нарваться на странный баг, когда в одном случае у тебя так работает, а в другом иначе.

@vitkarpov
Copy link
Member

Ну, или мигрануть на новую версию jQuery, если такое поведение где-то поправили. Но это может быть болезненно и ненужно — лучше уж вообще от него отказаться :D

@alexeyten
Copy link
Contributor

Хорош уже. Это нужно задокументировать как странный случай и не трогать. Я не могу представить зачем можно в здравом уме хотеть вешать один и тот же обрабочик событий дважды, а извращенцы должны страдать.

@chestozo
Copy link
Member Author

chestozo commented Jul 15, 2016

А что, если я хочу снять только один обработчик?

А что если ты хочешь снять оба?

Я не согласен, что это полезная фича. Почему в jquery снимают оба мне ясно. Почему стоит снять только on мне не ясно.

@iEgit
Copy link
Collaborator

iEgit commented Jul 15, 2016

А что если ты хочешь снять оба?

Два раза сделаю off, нет проблем.

А почему в jQuery снимают оба?

@chestozo
Copy link
Member Author

Два раза сделаю off, нет проблем.

А где 2 там и 3 ;)

Ну чтобы "2 раза не вставать" я так думаю.
Ну т.е. off выключает обработку события и всё тут.
А не то, что он что-то выключает, а что-то - не выключает. Это как-то странно.

Я согласен, с тем, что это кривые руки делать ns.events.on('myEvent', handler) + ns.events.once('myEvent', handler), но ещё раз повторюсь, это может быть багом и лучше не дать себе выстрелить в ногу.

@3y3
Copy link

3y3 commented Feb 10, 2017

Давайте я вам приведу пример двойного навешивания обработчика:

    models: {
        'some-model': {
            'ns-model-changed.something': function() {
                ns.on('special:model:async-event', this.handle);
            }
        }
    },

    events: {
        'ns-view-hide': function() {
            ns.off('special:model:async-event', this.handle);
        }
    },

    methods: {
        handle: function(data) {
            if (data.finished) {
                ns.off('special:model:async-event', this.handle);
            } else {
                 ...
            }
        },

        someWaitMethod: function() {
             ns.once('special:model:async-event', this.handle);
        }
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants