0

我正在 AngularUI 中编写一个带有一些过滤的事件日历。

<div
    id="calendar"
    ui-calendar="{ height: 450, editable: false, defaultView: 'month' }" 
    class="span9 pull-right calendar"
    ng-model="events"
</div>

当过滤器下拉列表更改时,会触发一个函数,该函数应该执行一些巫术并更新 $scope.events。

(缩短)

// Clear $scope.events
$scope.events = [];

// Initialise new events
var new_events = all_events;

if($scope.events_filter.type != 'all') {

    // Do filter
    new_events = json_service.filter(
        new_events,
        'type',
        $scope.events_filter.type
    );
}

// Update $scope.events
$scope.events = new_events;

让我们从 6 个事件开始。如果有两种“类型”,每个类型有 3 个事件,让我们调用一种类型 A 和一种类型 B,您可以从 All 更改为 A,三个事件将正确显示。如果您改回“全部”,则将有 6 个可见。

如果您从 A 更改为 B,日历不会更新,但是,检查 $scope.events 会显示数据已更改。

过滤有效,并且 $scope.events 正在更新。

问题似乎是,如果 $scope.events 长度没有改变 - 它认为不适合重绘日历。

4

2 回答 2

3

你是对的。如果 events 数组的长度没有改变,日历将不会更新。这是因为 Angular 不会检测到整个数组对象的变化(不会引发摘要错误),而是需要观察更集中的变量集或观察返回一个事件源的函数才能正常工作。

两次编辑解决了这个特定问题。将 getOptions() 添加到 watch 方法值,并观察第一个事件源或观察所有事件源并将 equalsTracker 添加到指令的属性。

这是一个日历的链接,它从过滤器服务中切换出 2 个事件数组。(但这并不能解决您的问题)http://plnkr.co/edit/VbYDNK?p=preview

日历现在正在查看 eventSources 中的第一个事件数组。因此,现在您可以在范围上使用 angular 控制的任何事件都可以添加到第一个数组中,然后如果您需要拉入任何源,您可以在任何给定时间调用 fullcalendar 的 addSource 方法或您选择的任何其他方法。

这是一个更加开放的日历,它创造了许多攻击角度。

这是一个日历的链接,它正在观察第一个数组本身而不是它的长度。这也有效,所以也许我们应该选择这个。(这解决了你的问题)http://plnkr.co/edit/AU6KNZ?p=preview

我读过它可能会导致观看大型数组的性能问题。

编辑:我已经回到绘图板并找到了一种方法来解决所有这些问题。现在我们不再需要查看事件源中的第一个数组,而只需查看跟踪器变量即可。tracker 变量将观察 eve​​ntSources 中所有事件的长度加上 eventSources 本身的长度。这将允许在 eventSources 内部观察任何数组,并且仍然让 angular 发挥它的魔力。

由于这个特定的用例,一个 equalsTracker 属性已添加到日历中。此 equalsTracker attr 必须是一个数字,并且应该在运行过滤器服务时更新,并且结果事件数组的长度与当前被过滤的 scope.events 数组的长度相同。

于 2013-01-30T14:34:16.157 回答
0

我找到了解决办法!在 joshkurz 的帮助下,我意识到它只是检查长度变化。

简单的解决方案: -

在过滤 $scope.events 的检查长度之前。

过滤后检查 $scope.events 的长度。

var length = $scope.events.length;
$scope.events = [];
var new_events = all_events;

... filter new_events a little bit ...

$scope.events = new_events;

if($scope.events.length == length) {
    $scope.events.push({});
}

长度不再不同了;)

谢谢乔希:)

于 2013-01-30T15:36:46.397 回答