Загрузка событий fullcalendar из базовой коллекции нарушает следующие и предыдущие функции - PullRequest
3 голосов
/ 31 декабря 2011

Noob кодер здесь.

У меня проблемы с привязкой fullcalendar к backbone.js.Моя проблема возникает, когда я использую кнопки «предыдущий» и «следующий» в fullcalendar для навигации.

Вот ошибка: я делаю новое событие.Событие отображается в календаре.Я нажимаю «дальше».Я нажимаю «предыдущий».Новое событие исчезло.

Похоже, что fullcalendar ожидает опцию 'events' при загрузке, чтобы указать функцию или фид JSON для загрузки событий из.Согласно документам, «FullCalendar будет посещать URL-адрес всякий раз, когда ему нужны новые данные о событиях. Это происходит, когда пользователь нажимает предыдущий / следующий или изменяет представления».запросите у Backbone объект JSON из коллекции событий (в котором хранятся все события).

Я пытался использовать events: function () {events.toJSON ();} и events: function () {events.fetch ();} без удачи.Помощь очень ценится.

Вот мой основной код:

$(function(){
    var Event = Backbone.Model.extend();

    var Events = Backbone.Collection.extend({
        model: Event,
        url: 'events'
    }); 

    var EventsView = Backbone.View.extend({
        initialize: function(){
            _.bindAll(this); 

            this.collection.bind('reset', this.addAll);
            this.collection.bind('add', this.addOne);
            this.collection.bind('change', this.change);            
            this.collection.bind('destroy', this.destroy);

            this.eventView = new EventView();            
        },
        render: function() {
            this.el.fullCalendar({
                header: {
                    left: 'prev,next today',
                    center: 'title',
                    right: 'month,basicWeek,basicDay'
                },
                selectable: true,
                selectHelper: true,
                editable: true,
                ignoreTimezone: false,                
                select: this.select,
                defaultView: 'agendaWeek',
            //  events: function() {events.toJSON();},
                eventClick: this.eventClick,
                eventDrop: this.eventDropOrResize,        
                eventResize: this.eventDropOrResize
            });
        },
        addAll: function() {
            this.el.fullCalendar('addEventSource', this.collection.toJSON());
        },
        addOne: function(event) {
            this.el.fullCalendar('renderEvent', event.toJSON());
        },        
        select: function(startDate, endDate) {
            this.eventView.collection = this.collection;
            this.eventView.model = new Event({start: startDate, end: endDate});
            this.eventView.render();            
        },
        eventClick: function(fcEvent) {
            this.eventView.model = this.collection.get(fcEvent.id);
            this.eventView.render();
        },
        change: function(event) {
            // Look up the underlying event in the calendar and update its details from the model
            var fcEvent = this.el.fullCalendar('clientEvents', event.get('id'))[0];
            fcEvent.title = event.get('title');
            fcEvent.color = event.get('color');
            this.el.fullCalendar('updateEvent', fcEvent);           
        },
        eventDropOrResize: function(fcEvent) {
            // Lookup the model that has the ID of the event and update its attributes
            this.collection.get(fcEvent.id).save({start: fcEvent.start, end: fcEvent.end});            
        },
        destroy: function(event) {
            this.el.fullCalendar('removeEvents', event.id);         
        }        
    });

    var EventView = Backbone.View.extend({
        el: $('#eventDialog'),
        initialize: function() {
            _.bindAll(this);           
        },
        render: function() {
            var buttons = {'Ok': this.save};
            if (!this.model.isNew()) {
                _.extend(buttons, {'Delete': this.destroy});
            }
            _.extend(buttons, {'Cancel': this.close});            

            this.el.dialog({
                modal: true,
                title: (this.model.isNew() ? 'New' : 'Edit') + ' Event',
                buttons: buttons,
                open: this.open
            });

            return this;
        },        
        open: function() {
            this.$('#title').val(this.model.get('title'));
            this.$('#color').val(this.model.get('color'));            
        },        
        save: function() {
            this.model.set({'title': this.$('#title').val(), 'color': this.$('#color').val()});

            if (this.model.isNew()) {
                this.collection.create(this.model, {success: this.close});
            } else {
                this.model.save({}, {success: this.close});
            }
        },
        close: function() {
            this.el.dialog('close');
        },
        destroy: function() {
            this.model.destroy({success: this.close});
        }        
    });

    var events = new Events();
    new EventsView({el: $("#calendar"), collection: events}).render();
    events.fetch();
});

1 Ответ

0 голосов
/ 06 января 2012

Посмотрев на эту проблему навсегда, я понял, что добавляю встречу (модель) в коллекцию и вызываю renderEvent () без флага [, stick], равного true.Это заставило мои встречи исчезнуть при нажатии кнопки «Далее / Назад».

http://arshaw.com/fullcalendar/docs/event_rendering/renderEvent/

Из документации: "http://arshaw.com/fullcalendar/docs/event_rendering/renderEvent/"

" Обычно событие исчезает, когда календарь перезагружает источники событий (например, при нажатии на предыдущий / следующий),Однако, указав stick как true, событие будет постоянно зафиксировано в календаре. "

...