如何将jsonp与angular-ui日历一起使用

时间:2014-04-28 20:29:55

标签: angularjs calendar jsonp angular-ui

我正在使用angular-ui日历尝试从我的API中提取事件。 API位于一个单独的域中,因此我必须使用jsonp。

我已经尝试了各种方法来实现这项功能,但无法将事件发送到我的日历上。

我构建了一个调用API的服务

angular.module('myapp.services', ['ngResource'])
.factory( 'SurgerySource', ['$resource', function($resource){
    return $resource(
        'http://api.mydomain.com/calendar.json?callback=JSON_CALLBACK&start=:start&end=:end',
        {start:'@start', end:'@end'},
        { jsonp_query: { method: 'JSONP', isArray: true } }
    );
}]);

在我的日历控制器中,我可以直接调用它并在日历上获取活动

angular.module('myapp.schedule', ['ui.calendar', 'ui.bootstrap', 'myapp.services'])
.controller('ScheduleCtrl', function ScheduleCtrl( $scope, SurgerySource ) {
    $scope.surgeries = SurgerySource.jsonp_query({
        start: 1396162800,
        end: 1399791600
    });
    $scope.uiConfig = { ... };
    $scope.eventSources = [$scope.surgeries];
});

这会使用硬编码的日期范围填充日历。我无法想办法从日历视图中获取开始和结束范围,所以我尝试使用调用函数的事件源(根据此处的文档http://angular-ui.github.io/ui-calendar/)这得到了视图中的日期范围,但我无法将返回的json返回到$ scope。

 $scope.eventSource = function (start, end, callback) {
     s = new Date(start).getTime() / 1000;
     e = new Date(end).getTime() / 1000;
     var eventPromise = SurgerySource.jsonp_query({
         start: s,
         end: e
     });
     callback(eventPromise);
 };

如果我检查eventPromise,我看到它是一个abject,其中的数据(作为一个数组?)与$ promise对象和$ resolved对象:

[
  0 -> Resource
  1 -> Resource
  2 -> Resource
  $promise -> Object
  $resolved -> true
]

回调没有做任何事情,事件没有放到日历上。

我还尝试将此功能放入配置中的viewRender。

$scope.uiConfig = {
    calendar:{
        height: 450,
        editable: true,
        header:{
            left: 'title',
            center: '',
            right: 'today prev,next'
        },
        eventClick: $scope.alertOnEventClick,
        viewRender: function(view,element) {
            $scope.surgeries = SurgerySource.jsonp_query({
                start: view.visStart.getTime()/1000,
                end: view.visEnd.getTime()/1000
            });
            console.log($scope.surgeries);
        }
    }
};
$scope.surgeries = [];
$scope.eventSources = [$scope.surgeries];

我看到日历打开时记录的数据,但事件未填充到日历中。

所以我要么想弄清楚如何从日历视图中获取日期范围,所以我可以使用我的硬编码方法。 或者我需要弄清楚如何从promise(?)对象中获取资源数据并将其发送到$ scope.eventSources

1 个答案:

答案 0 :(得分:3)

我通过切换到$ http而不是构建服务来实现这一点。我的新eventSource函数看起来像这样

$scope.eventSource = function (start, end, callback) {
    var startDate = start.getTime()/1000;
    var endDate = end.getTime()/1000;
    var url = 'http://api.mydomain.com/app_dev.php/calendar.json?callback=JSON_CALLBACK&start='+startDate+'&end='+endDate;

    $http.jsonp(url)
        .then(function(response){
            callback(response.data);
        });
};

我还必须确保我的源代码是发送时间戳而不是日期字符串。