Това е първият ми проект с angular и имам проблеми да разбера цикъла на дайджест на системата.
Моят проблем е следният.
Създадох директива за месечен календар. Дните се показват с ng-повторение, което повтаря списък на променлива, наречена scope.days.
<div class="month-calendar>
<div class="month-calendar-month">{{month}}</div>
<div class="month-calendar-daysweek" ng-repeat="dayweek in daysweek">{{dayweek}}</div>
<div class="month-calendar-day" ng-repeat="day in days">{{day}}</div>
<div class="month-calendar-nav-prev" ng-click="previousMonth()"</div>
<div class="month-calendar-nav-current" ng-click="currentMonth()"</div>
<div class="month-calendar-nav-next" ng-click="nextMonth()"</div>
</div>
Календарът е правилно изграден, защото имам всеки ден вграден блок и с процент 1/7 * 100%.
Когато извикам някоя от функциите previousMonth(), currentMonth() или nextMonth(), генерирам новия месец чрез нулиране на scope.days и актуализиране с новите стойности.
Това, което искам, е да добавя ефект на слайд върху промяната на месеца. Ако щракна върху следващия месец, старият ще се плъзне наляво навън, а новият ще се плъзне наляво. Ако щракна върху предишния, слайдът ще бъде с дясна посока.
Затова добавих променливата scope.slideDirection, която може да обработва "left" или "right" и която е обвързана с ng-класа на родителския div месец-календар.
Накрая, за да добавя анимацията, добавих модула ngAnimate, добавих променлива scope.showCalendar, която е булева и която също е обвързана с ng-show на родителския div месец-календар.
С css имам класовете, които стилизирах с правилни анимации
.month-calendar.left.ng-hide-add
.month-calendar.left.ng-hide-remove
.month-calendar.right.ng-hide-add
.month-calendar.right.ng-hide-remove
Сега проблемът е в моята функция, която променя месеца. Бих искал да имам това за следващия месец
scope.slideDirection = "left";
scope.showCalendar = false;
scope.generateNextMonth();
scope.showCalendar = true;
Проблемът е, че цикълът на дайджест се стартира в края на инструкциите и посоката не е зададена, когато настъпи преходът. Освен това преходът няма достатъчно време за стартиране, тъй като булевото значение е превключващо true веднага след false.
Ето едно решение, което написах, но изглежда, че изпълнява няколко цикъла на дайджест и може да не съм правилният начин за това. Много е бавен на мобилни устройства.
scope.slideDirection = "left";
$timeout(function() {
$timeout(function() {
scope.showCalendar = false;
}, 0);
$timeout(function() {
scope.generateNextMonth();
}, 300);
$timeout(function() {
scope.showCalendar = true;
}, 300);
}, 0);
Ако някой има идея и знае кой е идеалният начин да го направи, би било страхотно.
Благодаря
РЕДАКТИРАНЕ
Ето FIDDLE
Във цигулката зададох прехода на непрозрачност 0 или 1 вместо на слайд. (само за опростяване). И анимацията не се изпълнява правилно всеки път. Не мога да разбера защо.