【问题标题】:Paginate By Week - AngularJS按周分页 - AngularJS
【发布时间】:2014-11-11 18:34:59
【问题描述】:

我正在尝试在 AngularJS 中按周对事件列表进行分页(使用 ng-repeat)。我有一个自定义过滤器,它只显示本周内的事件,但我正在尝试添加功能来查看未来和过去几周。

这是我用于事件列表的过滤器 -

$scope.week = function(item) {
    var weekStart = moment().startOf('week');
    var weekEnd = moment().endOf('week');
    var eventTime = moment(item.jsdatetime);
        if (eventTime >= weekStart && eventTime <= weekEnd) return true; 
            return false;
};

我尝试使用 ng-click 调用一个使用 moment.js 的函数来 .add(7, 'days');到 weekStart 和 weekEnd 变量,但似乎无法让它工作。

任何帮助将不胜感激。

这是一个具有基本功能的 CodePen - http://codepen.io/drewbietron/pen/xbKNdK

【问题讨论】:

  • 你能创建一个基本的 plunker 来演示正在做什么吗?这是一个开始的模板:plnkr.co/edit/TkONdJqtD6nSg6s0Da59?p=info 原因是我们需要查看更多代码来帮助您。
  • @EliteOctagon - 我在原始帖子中添加了一个 CodePen 示例

标签: angularjs momentjs angularjs-ng-click angular-directive angular-filters


【解决方案1】:

moment() 始终返回当前日期/时间。

您需要将对它的引用存储到一个变量中,然后将其用于操作。
因为你有其他变量取决于它,我会创建一个函数来一次设置所有这些变量

所以在控制器中我将顶部更改为

var currentDate,
    weekStart,
    weekEnd,
    shortWeekFormat = 'MMMM Do';

function setCurrentDate(aMoment){
  currentDate = aMoment,
  weekStart = currentDate.clone().startOf('week'),
  weekEnd = currentDate.clone().endOf('week')
}

// initialize with current date
setCurrentDate(moment());

// use these methods for displaying 
$scope.currentWeek = function(){ return currentDate.format(shortWeekFormat); }; 
$scope.currentWeekStart = function(){ return weekStart.format(shortWeekFormat); };
$scope.currentWeekEnd = function(){ return weekEnd.format(shortWeekFormat); };

然后为下一周/上一周创建两个方法

$scope.nextWeek = function(){
  setCurrentDate(currentDate.add(7,'days'));
};
$scope.prevWeek = function(){
  setCurrentDate(currentDate.subtract(7,'days'));
};

moment.js 实现了valueOf,因此您可以进行直接比较
最后更改您的周过滤器以实际比较日期(使用 .isSame().isBefore().isAfter())而不是时刻对象(这是错误的,因为您无法对自定义对象进行直接比较

$scope.week = function(item) {
    var eventTime = moment(item.jsdatetime);

    if ((eventTime.isSame(weekStart) || eventTime.isAfter(weekStart))&& 
        (eventTime.isSame(weekEnd) || eventTime.isBefore(weekEnd))) return true; 

    return false;
};

$scope.week = function(item) {
    var eventTime = moment(item.jsdatetime);

    return (eventTime >= weekStart && eventTime <= weekEnd);
};

您也很可能希望li 元素上的ng-repeat 而不是ul

演示地址 http://codepen.io/gpetrioli/pen/QwLRQB

【讨论】:

  • 我正在使用 GroupBy 过滤器github.com/a8m/angular-filter#groupby 并调用嵌套的ng-repeat,以便我可以在日历视图中获取它们并且只显示一次。所以我在ul 上调用最初的ng-repeat,然后在li 上调用嵌套的@。
  • 我明白了。然后你可以忽略那部分答案:)
  • 哈,我应该在 CodePen 上打开它 - 不得不将我正在迭代的数据的超级简化版本放在一起,而忽略了其中的那一部分。不过,我感谢您的帮助!
【解决方案2】:

weekStart 和 weekEnd 变量不存在于 week(item) 的范围之外。如果您使用 ngClick 调用试图修改这些变量的函数,它只会返回 undefined。我不知道您的布局如何,但我会将这两个变量拉到 week 函数之外并使其成为 $scope 变量。

另外,我会让 ngClick 调用一个函数来更改两个 $scope 变量(根据您想要进入的方向,加 7 或减 7)。

$scope.weekStart = moment().startOf('week');
$scope.weekEnd = moment().endOf('week');

$scope.week = function(item) {
    var eventTime = moment(item.jsdatetime);
    if (eventTime >= $scope.weekStart && eventTime <= $scope.weekEnd) return true; 
      return false;
    };

$scope.update= function(direction) {
    $scope.weekStart.add(direction, 'days');
    $scope.weekEnd.add(direction, 'days');
}

并在您的视图中创建两个按钮:

<a href="#" ng-click="update(-7)">Previous week</a>
<a href="#" ng-click="update(7)">Next week</a>

【讨论】:

  • 感谢您的帮助。我如何调用适用于该特定过滤器的 ng-click 函数?
  • 对不起,我误解了你是如何使用 week 的。现在我已经查看了代码,您不会使用 ngClick 来调用调用 week 函数的函数,因为 week 只是您的过滤器。相反,我会在 week 过滤器中将 weekStart 和 weekEnd 更改为 $scope 变量。在 ngClick 函数中,您可以操作 $scope.weekStart 和 $scope.weekEnd 变量。我在使用 codepen 时遇到问题,所以我现在无法展示示例。但是,这应该是您需要做的所有事情。我用一个小代码示例更新了我的答案。
  • 这对改变一周非常有效,谢谢。知道如何禁用超过特定日期的点击 - 比如说它是否在过去?
  • 您可以尝试使用 ngDisabled 指令并让它根据当前日期(或您不想过去的其他日期)检查 weekStart。编辑:澄清一下,我的意思是尝试在视图的锚标记中使用 ngDisabled。
猜你喜欢
  • 2016-10-24
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多