0

Я пытаюсь разбивать список событий (используя ng-repeat) на неделю в AngularJS. У меня есть настраиваемый фильтр, который отображает только события на текущей неделе, но я пытаюсь добавить функциональность, чтобы смотреть на будущее и прошлые недели.Paginate By Week - AngularJS

Вот фильтр я использую для списков событий -

$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; 
}; 

Я попытался с помощью нг щелчок, чтобы вызвать функцию, которая использует moment.js для .Добавьте (7, «дни»); к переменным weekStart и weekEnd, но, похоже, не может заставить их работать.

Любая помощь будет оценена по достоинству.

Вот CodePen с основной функциональностью происходит - http://codepen.io/drewbietron/pen/xbKNdK

+0

могли бы вы создать базовый plunker для демо, что делается? Вот шаблон для запуска: http://plnkr.co/edit/TkONdJqtD6nSg6s0Da59?p=info причина заключается в том, что нам нужно увидеть больше кода, чтобы помочь вам. – SoluableNonagon

+0

@EliteOctagon - Я добавил пример CodePen к своему оригинальному сообщению – Drewbietron

ответ

0

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')); 
}; 

(момент.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); 
}; 

(вы также, скорее всего, хотят ng-repeat на li элементов, а не ul)

Демо наhttp://codepen.io/gpetrioli/pen/QwLRQB

+0

Я использую фильтр GroupBy https://github.com/a8m/angular-filter#groupby и вызывая вложенные 'ng-repeat' в течение дней, чтобы я мог получить их в виде календаря и показывать только дни один раз. Поэтому я вызываю начальный 'ng-repeat' на' ul', а затем вложенный в 'li'. – Drewbietron

+0

Я вижу. вы можете проигнорировать эту часть ответа тогда :) –

+0

Ха, я должен был включить его в CodePen - пришлось сбрасывать супер упрощенную версию данных, которые я просматриваю и пропускаю эту часть. Я ценю помощь, хотя! – Drewbietron

0

weekStart и WeekEnd переменные не существуют вне сферы недели (пункт). Если вы используете ngClick для вызова функции, которая пытается изменить эти переменные, она просто вернется не определена. Я не знаю, как ваш макет, но я бы вытащил эти две переменные за пределами функции недели и сделал их переменными $ scope.

Кроме того, у меня будет функция ngClick, которая изменит две переменные переменной $ (либо добавит 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> 
+0

Спасибо за помощь. Как я могу назвать функцию ng-click, которая применяется к этому конкретному фильтру? – Drewbietron

+0

Извините, я неправильно понял, как вы использовали неделю. Теперь, когда я просмотрел код, вы не будете использовать ngClick для вызова функции, которая вызывает функцию week, поскольку неделя - это ваш фильтр. Вместо этого я бы изменил переменные weekStart и weekEnd на переменные $ scope в течение фильтра недели. В функции ngClick вы можете манипулировать переменными $ scope.weekStart и $ scope.weekEnd. У меня проблемы с codepen, поэтому я не могу показать пример прямо сейчас. Однако это должно быть все, что вам нужно. Я обновил свой ответ небольшим образцом кода. – nairys

+0

Это отлично работает, чтобы изменить неделю, спасибо. Любая идея, как я отключу клик для выхода за определенную дату - скажите, если это в прошлом? – Drewbietron