【问题标题】:Angular ui-calendar (FullCalendar) not binding to scope eventsAngular ui-calendar (FullCalendar) 未绑定到范围事件
【发布时间】:2016-03-06 21:06:08
【问题描述】:

在使用 Angular 和 FullCalendar(通过 angular-ui-calendar 项目)时,我似乎无法使事件绑定正常工作。

硬编码事件时:

    $scope.events = [
        {
            title: 'Event1',
            start: '2016-03-04'
        }
    ];
    $scope.eventSources = {
        events: $scope.events,
        color: '#999',
        textColor: 'black'
    };

一切正常。

但是,由于该页面包含事件过滤器,因此我需要能够随时修改它们。这样做时,日历上的任何内容都不会被修改。

我尝试了许多不同的方法,并阅读了 angular-ui-calendar 和 fullCalendar 文档,但找不到任何关于绑定无法立即使用的线索。

当我这样做时(使用超时只是为了简化问题,请考虑使用 Ajax 请求):

    $scope.events = [];
    $scope.eventSources = {
        events: $scope.events,
        color: '#999',
        textColor: 'black'
    };
    $timeout(function() {
      $scope.events = [
        {
            title: 'Event1',
            start: '2016-03-04'
        }
      ];
   },1000);

日历中没有添加任何内容。 我尝试使用

在 fullCalendar 元素上调用刷新方法
uiCalendarConfig.calendars.myCalendar.fullCalendar('rerenderEvents');
//also tried - uiCalendarConfig.calendars.myCalendar.fullCalendar('refetchEvents');
//also tried - uiCalendarConfig.calendars.myCalendar.fullCalendar('render');

uiCalendarConfig 已正确注入控制器)。

我也尝试使用$scope.$apply() 包装代码,但没有成功。

我之前直接通过 javascript/jQuery API 使用 fullCalendar 并且效果很好,angular-ui-calendar 文档指出“ui-calendar 指令与 ng-model 配合得很好。”但到目前为止,它只是痛苦。

我的实际 HTML 标签是

<div ui-calendar="uiConfig.calendar" ng-model="eventSources" calendar="myCalendar"></div>

控制台中没有任何错误。

关于如何解决这个问题以及为什么事件绑定不是人们想象的直接方法的任何想法?

【问题讨论】:

    标签: angularjs fullcalendar


    【解决方案1】:

    事件在日历小部件初始化期间绑定。 这就是为什么如果您希望动态更新它的唯一机会,当您拥有生成事件所需的所有信息等时,您必须初始化小部件。 例如,您可以做的是将您的小部件放入

    <div ng-if="widgetConfigLoaded">...</div>
    

    在设置配置后将 widgetConfigLoaded 设置为 true

    你也可以尝试,但可能不会因为我刚才说的薄而不是

    $timeout(function() {
          $scope.events = [
            {
                title: 'Event1',
                start: '2016-03-04'
            }
          ];
       },1000);
    

    你可以试试

     $timeout(function() {
          $scope.events.push(
            {
                title: 'Event1',
                start: '2016-03-04'
            }
          );
       },1000);
    

    因为您所做的是用新数组覆盖 $scope.events。这个新数组与您之前链接到配置的 $scope.events 无关。配置里面仍然有一个空数组。

    为了更清楚地考虑以下代码:

    var a = [];
    var b = a;
    a = [1,2,3];
    

    你希望 b 是什么?它当然是一个空数组。

    【讨论】:

    • 谢谢,但这似乎是一个很大的警告,你是说没有“角度”的方式来修改初始化后显示的事件吗?
    • 看看我编辑的帖子。如果第二部分对您没有帮助,那就是这样。那么 angular-ui-calendar 不支持“稍后”绑定事件。这种情况经常发生。这只是指令的问题,因为它没有“以这种方式实现”
    • 我已经尝试将数据推送到$scope.events,不幸的是不起作用。
    • 那就不是真正的绑定
    • 这与绑定本身无关。但我知道你的意思。是的,它只是一个配置的传递。该指令“不必”在运行时支持配置更改。有时这甚至是不可能的,因为它不知道如何处理配置的变化。它以配置在指令范围内更改的方式绑定。但这并不意味着指令必须对这些变化做出反应。这是一个实施和定义的问题
    【解决方案2】:

    为了将新的/更新的/删除的事件应用到日历,我必须重新加载整个事件渲染。

        function formulateSources() {
            console.log('formulating sources',events);
            $scope.eventSources = [events];
            if(uiCalendarConfig.calendars.myCalendar) {
                uiCalendarConfig.calendars.myCalendar.fullCalendar('removeEvents');
                uiCalendarConfig.calendars.myCalendar.fullCalendar('addEventSource', events);
            }
        }
    

    【讨论】:

      【解决方案3】:

      你离得更近了一点。

      $scope.events = [
          {
              title: 'Event1',
              start: '2016-03-04'
          }
      ];
      

      在您的日历配置中设置此事件。

      events: $scope.events,
      

      【讨论】:

      • 没有任何区别,只是分配事件的方式不同。
      • 谢谢,但它不会解决帖子更改未显示在日历上的问题。每次实时更改事件时,我都找到了使用 removeEventsaddEventSource 的解决方法。
      • 您是否从 ajax 获取事件?
      • 确实,一旦加载,用户可以过滤掉事件,因此 $events 对象中的每个更改都需要反映在日历 UI 中。
      • 然后,您可以使用事件函数进行ajax调用,并使用callbalck函数将ajax响应设置为事件。
      猜你喜欢
      • 1970-01-01
      • 2015-09-30
      • 2019-09-09
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多