2012-06-17 33 views
11

Thông thường đây là một sự kiện trong lịch:jQuery đầy đủ, lặp lại mỗi thứ hai?

  { 

       title: 'Test', 

       start: '2012-06-08', 

       end: '2012-06-08', 

       url: 'test/test' 

      }, 

trình tốt. Mặc dù làm cách nào tôi có thể tạo 1 sự kiện hiển thị vào thứ Hai hàng tuần trong lịch? Hoặc mỗi thứ ba và như vậy phụ thuộc vào những gì ngày trong tuần/số bạn nhập? Whats param nếu có tồn tại?

Nếu nó không tồn tại, tôi có thể sửa đổi và thêm tính năng để thực hiện điều này không? Vì vậy, bạn có thể nhập một param như repeatEveryWeekDay: 2 (thứ hai là thứ hai), sau đó trên tất cả các thứ hai trong tương lai dữ liệu sẽ hiển thị ở đó.

Tôi đã thử tìm kiếm trong http://arshaw.com/fullcalendar/docs/event_data/Event_Object/ nhưng không thể tìm thấy bất kỳ thứ gì.

+1

Người đọc trong tương lai: Hiện có các cách tốt hơn để thực hiện việc này (3 năm sau), nhưng điều này vẫn nằm trong kết quả hàng đầu của google. Hãy xem http://stackoverflow.com/questions/15161654/recurring-events-in-fullcalendar – slicedtoad

Trả lời

33

fullCalendar cho phép thay vì truyền một loạt sự kiện, bạn có thể chuyển một hàm, ví dụ: tải xuống các sự kiện từ máy chủ hoặc tự động tạo các sự kiện đó.

Hầu hết các ví dụ trong tài liệu đều sử dụng các yêu cầu HTTP để nhận dữ liệu sự kiện. Nhưng chức năng gọi lại vẫn đủ linh hoạt để làm cho nó hoạt động theo cách bạn muốn.

Nhìn vào ví dụ sau Tôi vừa mới viết cho bạn:

$(document).ready(function() { 

    var date = new Date(); 
    var d = date.getDate(); 
    var m = date.getMonth(); 
    var y = date.getFullYear(); 

    $('#calendar').fullCalendar({ 
     header: { 
      left: 'prev,next today', 
      center: 'title', 
      right: 'month,agendaWeek,agendaDay' 
     }, 
     editable: true, 
     events: [ 
      // some original fullCalendar examples 
      { 
       title: 'All Day Event', 
       start: new Date(y, m, 1) 
      }, 
      { 
       title: 'Long Event', 
       start: new Date(y, m, d-5), 
       end: new Date(y, m, d-2) 
      }, 
      { 
       id: 999, 
       title: 'Repeating Event', 
       start: new Date(y, m, d-3, 16, 0), 
       allDay: false 
      } 
     ] 
    }); 

    // adding a every monday and wednesday events: 
    $('#calendar').fullCalendar('addEventSource',   
     function(start, end, callback) { 
      // When requested, dynamically generate virtual 
      // events for every monday and wednesday. 
      var events = []; 

      for (loop = start.getTime(); 
       loop <= end.getTime(); 
       loop = loop + (24 * 60 * 60 * 1000)) { 

       var test_date = new Date(loop); 

       if (test_date.is().monday()) { 
        // we're in Moday, create the event 
        events.push({ 
         title: 'I hate mondays - Garfield', 
         start: test_date 
        }); 
       } 

       if (test_date.is().wednesday()) { 
        // we're in Wednesday, create the Wednesday event 
        events.push({ 
         title: 'It\'s the middle of the week!', 
         start: test_date 
        }); 
       } 
      } // for loop 

      // return events generated 
      callback(events); 
     } 
    ); 
}); 

Chức năng tự động tạo ra trên một sự kiện cho mỗi thứ Hai và thứ tư giữa hai ngày. Ngày được chỉ định trong các thông số startend. Các thông số đó được chuyển qua fullCallendar. Các sự kiện được tạo bởi hàm trên được trả về fullCallendar thông qua hàm callback trong tham số thứ ba.

Tôi sử dụng DateJS để kiểm tra xem một ngày cụ thể có phải là thứ hai hay không.

CẬP NHẬT: Nếu bạn muốn kết hợp sự kiện tĩnh và/hoặc [nhiều hơn một] sự kiện lặp lại, bạn có thể sử dụng addEventSource.

+0

Cảm ơn câu trả lời hay của bạn! Bạn có thể chỉ cho tôi cách tôi có thể kết hợp các sự kiện tĩnh với ngày thực tế và nhiều sự kiện lặp lại được không? – Karem

+1

Chắc chắn! Tôi đã cập nhật mã ví dụ. Tôi đã sử dụng 'addEventSource' để thêm hai sự kiện lặp lại. –

+0

Cảm ơn bạn rất nhiều! Im thực sự gần với mục tiêu của tôi, tôi đang trộn php và js để đạt được mục tiêu của mình. Bây giờ tôi có một biến js có thể từ 1-7, 1 là chủ nhật và thứ bảy 7, làm thế nào tôi có thể làm như vậy nếu nó 2 nó nên kiểm tra là(). Monday(), và 3 là() .esesday() và như vậy? :-) Nếu không có tôi có nhiều bản sao của cùng một mã để có được điều này – Karem

1

Đó là trường ID của đối tượng sự kiện xác định độ lặp lại của sự kiện đó. Sử dụng cùng một ID cho tất cả các sự kiện lặp lại của bạn cho một ngày cụ thể trong tuần.

+0

Hmm Tôi không hiểu? Ví dụ trên tôi muốn nó lặp lại mỗi thứ hai, vì vậy thay vì có TẤN của các yếu tố trong các sự kiện [] với các ngày thứ hai trong năm, Im tìm kiếm Một yếu tố mà lịch đầy đủ hiển thị mọi thứ hai trong tương lai mà không có một ngày cụ thể? – Karem

+1

Tôi không nghĩ rằng FullCalendar theo mặc định hỗ trợ điều đó. Nếu không có dữ liệu trong đối tượng sự kiện [], thì nó sẽ hiển thị những sự kiện như thế nào? Bạn có thể thiết lập chương trình này bằng cách sử dụng một cuộc gọi lại như 'viewDisplay', nhưng ngay cả ở đó bạn sẽ cần phải tạo các đối tượng sự kiện. Ngắn của chỉnh sửa mã để thêm một tham số cấu hình mới, tôi nghĩ rằng bạn sẽ cần phải đạt được điều này bằng cách có một đối tượng cho mỗi sự kiện trong mảng sự kiện [] của bạn - với cùng một ID cho các sự kiện lặp lại. – ganeshk

+0

Tại sao nó lại có cùng ID ở đây? Và tôi sẽ cần phải tạo ra bởi PHP tất cả các ngày thứ hai sắp tới của năm hiện tại chỉ để hiển thị chúng mỗi thứ hai? ? – Karem

1

Cách tốt nhất tôi tìm thấy để giải quyết sự kiện lặp lại là thiết lập cuộc gọi JSON sang ngôn ngữ phụ trợ của bạn (tôi đang sử dụng Django/Python).

như vậy trong các tùy chọn lịch tôi sẽ phải:

events: { url: '/event-data', cache: false },

Sau đó, trong backend của tôi, tôi tận dụng lợi thế của các thông số đó được gửi cho hiển thị lịch 'start' hiện tại và 'kết thúc' URL GET biến. Ie:

hxxp://example.com:8000/event-data?start=2014-09-28&end=2014-11-09&_=1413553318353

một yêu cầu GET sẽ được gửi từ các tùy chọn các sự kiện, tôi sau đó xây dựng các sự kiện từ một cơ sở dữ liệu/file nguồn mà liệt kê các sự kiện lặp lại cùng với các sự kiện lịch thông thường, và gửi lại chỉ là danh sách các sự kiện xảy ra trong phạm vi ngày đó trong danh sách JSON.

6

Một cập nhật nhỏ cho bài đăng của Christopher Ramírez. Sử dụng fullCalendar tại v2.2.3 và momentjs tại v2.8.4 bạn cần phải sửa đổi vài dòng trong đoạn mã trên để làm cho nó làm việc:

Đầu tiên:

function(start, end, callback) {} 

để

function(start, end, status, callback) {} 

như tham số thứ ba là một boolean và thứ tư là hàm gọi lại

Sau đó:

for (loop = start.getTime(); 
    loop <= end.getTime(); 
... 

để

for (loop = start._d.getTime(); 
    loop <= end._d.getTime(); 

như các đối tượng bắt đầu và kết thúc truyền cho hàm không phải là đối tượng ngày và kêu gọi .getTime() trên họ sẽ kết thúc trong 'Không xác định không phải là một chức năng' lỗi.

Và đó là điều đó! Sửa đổi này đã làm cho nó hoạt động cho tôi.

+0

Vui lòng áp dụng chỉnh sửa này. – user3806549

Các vấn đề liên quan