Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.03.2014, 15:36
Аспирант
Отправить личное сообщение для San4ezy Посмотреть профиль Найти все сообщения от San4ezy
 
Регистрация: 15.11.2009
Сообщений: 38

События Backbone дублируются
Приветствую! Начал изучать Backbone и столкнулся с такой проблемой (код ниже). При переходе на 'tasks_table/:id' вызывается событие 'TasksTable:show'. Это событие обрабатывается вьюхой App.Views.TaskTb. Обработчик вызывает самописную функцию getRequest, отсылающую запрос на сервер и получающую jsonp, и создает новую коллекцию.
Проблема следующая. При переходе на указанный урл (с загрузкой страницы) все работает верно. Но если вызвать событие без перезагрузки страницы, например вызовом navigate или ссылкой на анкор, то событие срабатывает 2 раза. Следующий раз 4 и так далее. Как исправить эту ошибку?
(function(){

    window.App = {
        Models: {},
        Views: {},
        Collections: {},
        Router: {}
    };
    var vent = _.extend({}, Backbone.Events);

    // Router
    App.Router = Backbone.Router.extend({
        routes: {
            '': 'index',
            'tasks_table/': 'tasksTable',
            'tasks_table/:id': 'tasksTable'
        },
        index: function(){
            console.log('index');
        },
        tasksTable: function(id){
            vent.trigger('TasksTable:show', id);
        }
    });

    // View
    App.Views.TaskTb = Backbone.View.extend({
        tagName: 'table',
        initialize: function(){
            vent.on('TasksTable:show', this.show, this);
        },
        show: function(id){
            getRequest('GetTasksTable', 'project_type=' + id, function(data){
                var view = new App.Views.TaskTb({collection: new App.Collections.TaskTb(data['data'])});
                $('#tasks_table').append(view.render().el);
            });
        }
    });
    new App.Views.TaskTb();

    new App.Router();
    Backbone.history.start();
}());

И еще, при этом запросы выполняются значительно медленнее, чем напрямую к серверу. Может я что-то не так делаю?
Заранее всем спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 25.03.2014, 01:07
Профессор
Отправить личное сообщение для Hoshinokoe Посмотреть профиль Найти все сообщения от Hoshinokoe
 
Регистрация: 08.01.2012
Сообщений: 253

Ты после каждого запроса заново создаешь вьюху, хотя старая никуда не исчезла. Поэтому после первого запроса появляется вторая, и у нее такой же обработчик. И т. д.

В целом логика не верная. Нужно для текущей вьюхи просто устанавливать данные в коллекции.

show: function(id){
    var self = this;
    getRequest('GetTasksTable', 'project_type=' + id, function(data){
        self.collection = new App.Collections.TaskTb(data['data']);

	 _.each(self.collection.models, function (model, index) {
                var view = new App.Views.TaskTableRow({ model: model}); //создаешь отдельную вьюху для каждой строки
                self.el.append(view.render().el); // добавляем в таблицу
            }, self);

   });
}
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание глобального события kez jQuery 1 17.09.2012 11:49
Дебаг js, или как найти обработчик события для тега jimm88 Events/DOM/Window 1 18.04.2012 15:11
Как сделать чтобы клавиатурные события пропускались сквозь флешку? khusamov Общие вопросы Javascript 3 11.02.2012 16:48
Передача параметров в колбэки и дальнейшее их вешанье на события. Gremlin Общие вопросы Javascript 17 13.08.2011 08:54
Drug&Drop + всплывание события = проблемы =(( _NoName_ Events/DOM/Window 4 05.03.2009 17:47