2011-04-11 39 views
8

Tôi cần chạy một số mã javascript để tải lại lịch khi người dùng nhấp vào, các nút ngày/tuần/tháng. Có bất kỳ callback như dayButtonClicked() hoặc một cái gì đó?gọi lại cho các nhấp chuột vào nút thanh tiêu đề của tháng, tuần, ngày?

BUG xảy ra:

khi lần đầu tiên tải lịch. Cái nhìn ban đầu trông đẹp mỏ ban đầu tải ngày. Ngay sau khi tôi tải một chế độ xem khác như tuần. Mỗi mục duy nhất được sao chép và hiển thị cả hai nguồn dữ liệu. Nếu sau đó tôi nhấp lại và chuyển tiếp giữa ngày và tháng một lần nữa, dữ liệu sẽ trở lại bình thường. Điều gì đang xảy ra là removeEventSource không được gọi khi lần đầu tiên tải chế độ xem mới sau khi nhấp từ ngày này sang tuần khác. bạn đã thấy điều này xảy ra trước đây chưa?

<script type='text/javascript'> 

    $(document).ready(function() { 

     var date = new Date(); 
     var d = date.getDate(); 
     var m = date.getMonth(); 
     var y = date.getFullYear(); 
     var loadUrl = "menu_booking.php?ne=1&calsub=1"; 
     var lastView; 
     var fullSource = "../fullcalendar/json-events.php?idc=<?= $sClient ?>&v=long"; 
     var liteSource = "../fullcalendar/json-events.php?idc=<?= $sClient ?>"; 

     $('#calendar').fullCalendar({ 
      header: { 
       left: 'prev,next today', 
       center: 'title', 
       right: 'month,agendaWeek,agendaDay' 
      }, 
      columnFormat: { 
       month: 'ddd', 
       week: 'ddd d/M', 
       day: 'dddd d/M' 
      },   
      defaultView: 'agendaDay',   
      firstDay: 1,    
      //editable: true, 
      selectable: true, 
      allDaySlot: false, 
      firstHour: 7, 




      viewDisplay: function(view) { 
       if (lastView == undefined) { lastView = 'firstRun'; } 

       if (view.name != lastView) { 

       if (view.name == 'agendaWeek') { 
        $('#calendar').fullCalendar('removeEventSource', fullSource); 
        $('#calendar').fullCalendar('removeEventSource', liteSource); 
        $('#calendar').fullCalendar('addEventSource', fullSource); 
       } 
       if (view.name == 'agendaDay') { 
        $('#calendar').fullCalendar('removeEventSource', fullSource); 
        $('#calendar').fullCalendar('removeEventSource', liteSource); 
        $('#calendar').fullCalendar('addEventSource', liteSource); 
       } 

       if (view.name == 'month') { 
        $('#calendar').fullCalendar('removeEventSource', fullSource); 
        $('#calendar').fullCalendar('removeEventSource', liteSource); 
        $('#calendar').fullCalendar('addEventSource', fullSource); 
       } 
       lastView = view.name; 
       } 
      }, 

      timeFormat: { // for event elements 
       agendaDay: '', 
       agendaWeek: '', 
       month: '', 
       '': 'h(:mm)t' // default 
      },   

     }); 
     //$('#calendar').limitEvents(2); 
    }); 

</script> 

Tôi thậm chí đã sao chép mã của bạn chính xác như thế nào bạn làm điều đó bởi vì tôi nghĩ rằng có vấn đề với mã của tôi. ngay cả khi tôi thay đổi điều này:

 //VIEW CHANGE - ALSO ADDS INITIAL SOURCES PER DAY VIEW 
     viewDisplay: function(view) { 
       $('#calendar').fullCalendar('removeEventSource', fullSource); 
       $('#calendar').fullCalendar('removeEventSource', liteSource); 
       $('#calendar').fullCalendar('addEventSource', fullSource);    } 
     }, 

Nó vẫn tăng gấp đôi tải dữ liệu khi tôi chuyển từ chế độ xem được tải mặc định sang chế độ xem khác. Tôi bắt đầu nghĩ rằng đó chắc chắn là một lỗi trong FullCalendar. Lái xe cho tôi hạt

CHỈNH SỬA 2: MY GOD. Tôi không thể tin rằng nó cuối cùng cũng hoạt động!

Tôi không biết tại sao, nhưng tôi cần thiết để trao đổi xung quanh addEventSourceremoveEventSource nó bây giờ trông giống như sau:

 viewDisplay: function(view) { 
      if (lastView == undefined) { lastView = 'firstRun'; } 

      //alert("viewname: "+ view.name + "lastView: " + lastView); 
      if (view.name != lastView) { 
       if (view.name == 'agendaWeek') { 
        $('#calendar').fullCalendar('addEventSource', shortSource); 
        $('#calendar').fullCalendar('removeEventSource', longSource); 
        $('#calendar').fullCalendar('removeEventSource', shortSource); 
       } 
       if (view.name == 'agendaDay') { 
        //alert("in day: add litesource"); 
        $('#calendar').fullCalendar('addEventSource', longSource); 
        $('#calendar').fullCalendar('removeEventSource', longSource); 
        $('#calendar').fullCalendar('removeEventSource', shortSource); 
       } 

       if (view.name == 'month') { 
        //alert("in month: Delete litesource"); 
        $('#calendar').fullCalendar('addEventSource', shortSource); 
        $('#calendar').fullCalendar('removeEventSource', longSource); 
        $('#calendar').fullCalendar('removeEventSource', shortSource); 
       } 
       lastView = view.name; 
      } 
     }, 
+0

ai cũng có thể trợ giúp việc này? – wired00

+1

Holy crap, tôi đã cảm thấy nỗi đau của bạn trong vài tháng qua. Chỉ cần đi qua câu hỏi này sau khi vô số tìm kiếm. Hãy yên tâm, bài đăng của bạn đã giúp người khác! Cảm ơn. –

+0

ahh tốt để xem :) – wired00

Trả lời

2

Có - thật không may tùy thuộc vào cách bạn nhìn vào nó - nó có thể là một tính năng hoặc một lỗi!?! Dòng quan trọng là

ewDisplay: function(view) { 
      if (lastView == undefined) { lastView = 'firstRun'; } 
      if (view.name != lastView){ ... 

Từ bài đăng khác của tôi!

Tại sao lastView == undefined? Đó là bởi vì khi lịch đầu tiên tải ngay cả trước khi có bất cứ điều gì trên màn hình sự kiện này cháy!

Vì vậy, tôi thực hiện một var = lastview một nghỉ nó không xác định, khi sự kiện bắn lần đầu tiên nó gán firstRun nó có thể là bất cứ điều gì really- nhưng không phải là tên thực tế của bất kỳ monthView Bước này bỏ qua event- đầu tiên và sẽ không thêm thức ăn của bạn hai lần! Tôi đã thêm cả hai thứ này như là một lỗi với các nhà phát triển .. nhưng họ đang nghĩ về nó- bởi vì họ là những tính năng đáng gờm ..

Vì vậy, điều duy nhất còn lại là mã cứng một phương pháp bỏ qua- và đó là lý do tại sao điều này toàn bộ lastview là có cho. Tôi đã dành 2 hoặc 3 ngày cố gắng để gỡ lỗi vấn đề đó; bạn sẽ cần phải thực hiện theo dòng mã của bạn bằng dòng và xem khi nào các nguồn cấp dữ liệu đang được thêm vào và cố gắng tránh nó bằng cách nào đó.

Đừng quên đặt viewname cuối cùng vào cuối sự kiện.

... 
     lastView = view.name; 
    } 
+0

Ngoài ra, bạn có thể thử và xóa tất cả các sự kiện khi thay đổi chế độ xem - tôi cũng có phiên bản đó trước khi gọi ".fullCalendar ('removeEvents')" xóa tất cả các sự kiện, chứ không phải các nguồn. Nguồn đôi này là một vấn đề gây phiền nhiễu đôi chút - hy vọng nó sẽ được sửa trong bản phát hành tiếp theo. http://arshaw.com/fullcalendar/docs/event_data/removeEvents/ – ppumkin

+0

Mate, bạn đã được rất nhiều sự giúp đỡ và tôi ngạc nhiên khi bạn hiểu vấn đề của tôi :) Tôi đang làm mọi thứ bạn nói và vẫn gặp vấn đề đó. Yep tôi thực sự cũng đã thử các 'removeEvents' nhưng có một vấn đề lớn hơn với điều này, bất cứ khi nào tôi điều hướng với các mũi tên để đi tiếp/quay lại, nó sẽ thêm nhiều hàng trùng lặp hơn để tôi quay trở lại removeEventSource() 'và nó ít nhất chỉ có 1 bản sao. Tôi sẽ phải xây dựng một phiên bản cắt giảm hơn. Một với một nguồn json tĩnh và một màn hình lịch cơ bản mà tôi có thể đặt toàn bộ giải pháp công cộng và cho phép bản thân và các devs fullCalendr acces – wired00

+0

btw haha ​​của nó funy bạn nói bạn đã dành 2-3 ngày làm việc trên nó. Đêm qua khi tôi nhận được câu trả lời của bạn, tôi nhảy trên máy tính xách tay của tôi và để wifes của tôi mất tinh thần ngồi trên giường từ ~ 1 giờ sáng đến 4 giờ sáng làm việc trên nó! Mặc dù nó chưa được giải quyết nhưng tôi cũng vui vì bạn cũng thấy cùng một vấn đề và không chỉ riêng tôi! Chỉ cần làm rõ là bạn nói rằng bạn đã thực sự nhận được xung quanh rằng lỗi trùng lặp xảy ra với 'lastview == undefined' vv mã của bạn? – wired00

1

Thông thường cách nhấp vào nút xem sẽ cháy sự kiện này

Hãy cẩn thận vì đây sự kiện cũng sẽ kích hoạt nếu bạn thay đổi ngày trong chế độ xem theo ngày hoặc Tháng trong chế độ xem theo tháng nhưng bạn bằng cách vượt qua điều đó bằng cách lưu biến cuối cùng

jQuery ..

. 
viewDisplay: function(view) { ** } 
. 

Thay ** với một trong hai

.fullCalendar('refetchEvents') 

Nó sẽ chỉ nhận được thức ăn của bạn một lần nữa. như làm mới và cập nhật bất kỳ thay đổi nào có thể xảy ra http://arshaw.com/fullcalendar/docs/event_data/refetchEvents/

hoặc bạn có thể chuyển đổi nguồn

$('#calendar').fullCalendar('removeEventSource', '/diaryFeed.aspx?style=Complex'); $('#calendar').fullCalendar('addEventSource', '/diaryFeed.aspx?style=Basic'); 

Tuy nhiên, để tìm ra các nút được nhấp bạn sẽ cần phải làm điều này

eventClick: function(event, jsEvent, view) 
      { } 
+0

@pumpkin đó là một trợ giúp rất lớn. Tôi cũng đã đọc các bài đăng fullcalendar khác của bạn và tất cả đều rất hữu ích vì vậy đã thêm vào làm mục yêu thích. về cơ bản tôi chắc chắn rằng tôi đã thử 'viewDisplay: function (view)' nhưng tôi đã chắc chắn nó chỉ được gọi là callback khi trang ban đầu được nạp NOT khi tôi nhấp vào nút xem tức là, tuần/tháng/ngày. NHƯNG ... sau khi đọc mã chi tiết hơn của bạn trên một bài SO khác tôi đã thử lại viewDisplay vv và nó hoạt động hoàn hảo. Bây giờ thông qua cuộc gọi trở lại tôi sẽ chỉ cần kiểm tra tên xem. tức là nếu tháng, tải nguồn dữ liệu đơn giản nếu ngày, sau đó tải một souce chi tiết hơn. TY – wired00

+0

Tôi nhận được một vấn đề thực sự mà không có vấn đề gì tôi làm bất cứ khi nào tôi lần đầu tiên bấm vào một trong hai, tháng/ngày/tuần dữ liệu sẽ xuất hiện hai lần. về cơ bản là không xóa tất cả các mục có 'removeEventSource' tôi sẽ hiển thị mã của tôi trong chỉnh sửa ở trên – wired00

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