2016-04-05 2 views
8

Я довольно новичок в Angular 2 и пытаюсь понять, как интегрировать Angular 2 с существующими библиотеками UI Framework Javascript.Как использовать FullCalendar в Angular 2

Теперь я пытаюсь играть с плагином jQuery http://fullcalendar.io Или на самом деле я хочу использовать надбавку премиум-класса Scheduler.

Однако я создал простой пример в Plunker ...

Не стесняйтесь использовать его и просветить меня в том, как сделать его отображения, а также, как реагировать на нажатия на конкретных событиях.

https://plnkr.co/edit/eMK6Iy

... компонент FullCalendarComponent нуждается в модификации, конечно. Проблема в том, что я не знаю, как это сделать.

import {Component} from 'angular2/core'; 

@Component({ 
    selector: 'full-calendar', 
    template: '<p>Here I would like to see a calendar</p>' 
}) 

export class FullCalendarComponent { } 
+1

PrimeNG имеет интеграцию с FullCalendar, называемым компонентом расписания. http://www.primefaces.org/primeng/#/schedule Код компонента является открытым исходным кодом на https://github.com/primefaces/primeng/blob/master/components/schedule/schedule.ts –

+0

А, это выглядит хорошей отправной точкой. На самом деле мне нужно использовать надстройку под названием Scheduler. Я замечаю, что вы, похоже, работаете с этими бриллиантами. Поэтому, если у вас есть время. Не стесняйтесь также добавлять поддержку надстройки Scheduler :) –

+0

Спасибо, модуль планировщика кажется коммерческим дополнением, поэтому не уверен, как мы можем интегрировать его в PrimeNG. –

ответ

7

Вот как мне удалось заставить Планировщик работать в проекте Angular2. Я начал с компонента, называемого Schedule, созданного PrimeNG, как это было предложено в комментарии выше Cagatay Civici.

Мне пришлось изменить файл scheduler.component.ts, как показано ниже.

export class Scheduler { 
// Support for Scheduler 
@Input() resources: any[]; 
@Input() resourceAreaWidth: string;    
@Input() resourceLabelText: string; 
// End Support for Scheduler 

// Added functionality 
@Input() slotLabelFormat: any; 
@Input() titleFormat: any; 
@Input() eventBackgroundColor: any; 
// End added properties 

@Input() events: any[]; 
............ 
............ 
ngAfterViewInit() { 
    this.schedule = jQuery(this.el.nativeElement.children[0]); 
    this.schedule.fullCalendar({ 
     resources: this.resources, 
     resourceAreaWidth: this.resourceAreaWidth, 
     resourceLabelText: this.resourceLabelText, 
     titleFormat: this.titleFormat, 
     slotLabelFormat: this.slotLabelFormat, 
     eventBackgroundColor: this.eventBackgroundColor, 
     theme: true, 
     header: this.header, 
........... 

Тогда я должен был добавить CSS и скрипт для fullcalendar и планировщиком в index.html.

+0

как вы использовали этот планировщик (опубликовано в ответ): как директива или как-то в html-шаблоне? – meorfi

+0

Я узнал, как его использовать :) Спасибо. Кстати: можете ли вы отображать ресурсы в первом столбце при переключении на недельный режим? – meorfi

+0

Ресурсы в левом столбце были доступны, но события исчезли, когда я тестировал переход к просмотру недели. Однако для моей цели меня не интересует представление недели и у меня ограничено время для расследования проблемы. Надеюсь, вам удастся это решить! –

0

Перед началом, некоторые предпосылки в JavaScript каталоге:

JQuery-ui.min.js

jquery.min.js

fullcalendar.js

calendar.js

angular.js

bootstrap.js

Файлы, которые будут необходимы в каталоге CSS:

fullcalendar.css

bootstrap.css

Теперь создайте контроллер для обрабатывать данные и события: -

angular.module('myCalendarApp', ['ui.calendar']); 
function CalendarCtrl($scope, $http) { 

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


    //event source that pulls from google.com 
    $scope.eventSource = { 
      url: "http://www.google.com/calendar/feeds/usa__en%40holiday.calendar.google.com/public/basic", 
      className: 'gcal-event',   // an option! 
      currentTimezone: 'America/Chicago' // an option! 
    }; 


    //This will call onLoad and you can assign the values the way you want to the calendar 
    //here DataRetriever.jsp will give me array of JSON data generated from the database data 
    $http.get('DataRetriever.jsp').success(function(data) { 
     for(var i = 0; i < data.length; i++) 
     { 
      $scope.events[i] = {id:data[i].id, title: data[i].task,start: new Date(data[i].start), end: new Date(data[i].end),allDay: false}; 
     } 
    }); 

    /* 
    //to explicitly add events to the calendar 
    //you can add the events in following ways 
    $scope.events = [ 
     {title: 'All Day Event',start: new Date('Thu Oct 17 2013 09:00:00 GMT+0530 (IST)')}, 
     {title: 'Long Event',start: new Date('Thu Oct 17 2013 10:00:00 GMT+0530 (IST)'),end: new Date('Thu Oct 17 2013 17:00:00 GMT+0530 (IST)')}, 
     {id: 999,title: 'Repeating Event',start: new Date('Thu Oct 17 2013 09:00:00 GMT+0530 (IST)'),allDay: false}, 
     {id: 999,title: 'Repeating Event',start: new Date(y, m, d + 4, 16, 0),allDay: false}, 
     {title: 'Birthday Party',start: new Date(y, m, d + 1, 19, 0),end: new Date(y, m, d + 1, 22, 30),allDay: false}, 
     {title: 'Click for Google',start: new Date(y, m, 28),end: new Date(y, m, 29),url: 'http://google.com/'} 
    ]; 
    //we don't need it right now*/ 


    //with this you can handle the events that generated by clicking the day(empty spot) in the calendar 
    $scope.dayClick = function(date, allDay, jsEvent, view){ 
     $scope.$apply(function(){ 
      $scope.alertMessage = ('Day Clicked ' + date); 
     }); 
    }; 


    //with this you can handle the events that generated by droping any event to different position in the calendar 
    $scope.alertOnDrop = function(event, dayDelta, minuteDelta, allDay, revertFunc, jsEvent, ui, view){ 
     $scope.$apply(function(){ 
      $scope.alertMessage = ('Event Droped to make dayDelta ' + dayDelta); 
     }); 
    }; 


    //with this you can handle the events that generated by resizing any event to different position in the calendar 
    $scope.alertOnResize = function(event, dayDelta, minuteDelta, revertFunc, jsEvent, ui, view){ 
     $scope.$apply(function(){ 
      $scope.alertMessage = ('Event Resized to make dayDelta ' + minuteDelta); 
     }); 
    }; 

    /* 
    //this code will add new event and remove the event present on index 
    //you can call it explicitly in any method 
     $scope.events.push({ 
     title: 'New Task', 
     start: new Date(y, m, 28), 
     end: new Date(y, m, 29), 
     className: ['newtask'] 
     }); 

    $scope.events.splice(index,1);*/ 


    //with this you can handle the click on the events 
    $scope.eventClick = function(event){   
     $scope.$apply(function(){ 
      $scope.alertMessage = (event.title + ' is clicked'); 
     }); 
    }; 


    //with this you can handle the events that generated by each page render process 
    $scope.renderView = function(view){  
     var date = new Date(view.calendar.getDate()); 
     $scope.currentDate = date.toDateString(); 
     $scope.$apply(function(){ 
      $scope.alertMessage = ('Page render with date '+ $scope.currentDate); 
     }); 
    }; 


    //with this you can handle the events that generated when we change the view i.e. Month, Week and Day 
    $scope.changeView = function(view,calendar) { 
     currentView = view; 
     calendar.fullCalendar('changeView',view); 
     $scope.$apply(function(){ 
      $scope.alertMessage = ('You are looking at '+ currentView); 
     }); 
    }; 


    /* config object */ 
    $scope.uiConfig = { 
     calendar:{ 
     height: 450, 
     editable: true, 
     header:{ 
      left: 'title', 
      center: '', 
      right: 'today prev,next' 
     }, 
     dayClick: $scope.dayClick, 
     eventDrop: $scope.alertOnDrop, 
     eventResize: $scope.alertOnResize, 
     eventClick: $scope.eventClick, 
     viewRender: $scope.renderView 
     }  
    }; 

    /* event sources array*/ 
    $scope.eventSources = [$scope.events, $scope.eventSource, $scope.eventsF]; 
} 

Теперь в файле вида (JSP, GSP или HTML) добавить следующие коды: - Это должны быть добавлены до головы, AngularJS нормы (более подробно пройти через AngularJS учебник)

1 
2 
<html lang="en" ng-app="myCalendarApp" id="top"> 

Это даст основную структуру календаря с 3 кнопками повестки дня.

<div class="btn-toolbar"> 
    <div class="btn-group"> 
     <button class="btn btn-success" ng-click="changeView('agendaDay', myCalendar)">Day</button> 
     <button class="btn btn-success" ng-click="changeView('agendaWeek', myCalendar)">Week</button> 
     <button class="btn btn-success" ng-click="changeView('month', myCalendar)">Month</button> 
    </div> 
</div> 
<div class="calendar" ng-model="eventSources" calendar="myCalendar" config="uiConfig.calendar" ui-calendar="uiConfig.calendar"></div> 

Это где предупредительное сообщение будет показано

<div class="alert-success calAlert" ng-show="alertMessage != undefined && alertMessage != ''"> 
    <h4>{{alertMessage}}</h4> 
</div> 

Это даст список задач на текущую дату

<ul class="unstyled"> 
    <li ng-repeat="e in events | filter:currentDate"> 
     <div class="alert alert-info"> 
      <a class="close" ng-click="remove($index)"><i class="icon-remove"></i></a> 
      <b> {{e.title}}</b> - {{e.start | date:"MMM dd"}} 
     </div> 
    </li> 
</ul> 
+0

Это не Angular2 typescript –

4

Я создал пакет NPM

npm install angular2-fullcalendar --save 

вы можете использовать параметры ввод, чтобы полностью настроить компонент fullcalendar

чека на документах здесь https://github.com/nekken/ng2-fullcalendar

+1

Не могли бы вы предоставить/добавить демоверсию в репозиторий github с помощью углового2. –

+1

@SaiKiranMandhala я не мог заставить его работать с Angular2 и SystemJs. После перехода на webpack я мог загрузить полный календар. Но я борюсь с отображением событий сейчас ... https: //github.com/nekken/ng2-fullcalendar/issues/13 это проблема, которую я открыл, может быть, это может помочь вам – messerbill

Смежные вопросы