Это кажется таким простым и все же чрезвычайно сложным.
У меня есть компонент типа вкладок навигации, и для поддержки ситуации, когда для экрана слишком много вкладок, у меня есть меню переполнения ...разметка выглядит примерно так:
<ul class="tabs-container">
<li ng-repeat="feed in $ctrl.visibleFeeds track by feed.Id" ng-class="{active: feed.Id == activeTabId}">
<a ng-href="#" ng-if="!feed.edit">
<span ng-click="feed.edit = true">{{feed.Name}}</span>
</a>
</li>
<li uib-dropdown>
<a ng-href="#" uib-dropdown-toggle role="button">
<svg>--- menu icon ---</svg>
</a>
<ul class="dropdown-menu" uib-dropdown-menu role="menu">
<li ng-repeat="feed in $ctrl.hiddenFeeds track by feed.Id">
<a href="#">{{feed.Name}}</a>
</li>
</ul>
</li>
<li>
<a ng-href="#" ng-click="$ctrl.addNewFeed()">
<svg> --- add icon --- </svg>
</a>
</li>
</ul>
Надеюсь, вы можете заметить, что у меня есть два связанных массива, один для видимых каналов (вкладок) и один для скрытых каналов.
Теперь для перемещения каналовиз одной коллекции в другую мне нужно рассчитать, что слишком велико для экрана, поэтому у меня есть функция для вычисления того, что видно.Псевдокод этой функции выглядит примерно так:
- Сделать visibleTabs всей коллекцией.
- Подсчитать, сколько вкладок уместится.
- Переместить оставшиеся вкладки в hiddenTabscollection.
Проблема в том, что я не могу найти «правильный» способ ожидания завершения цикла дайджеста, поэтому я могу измерить вкладки.Я не могу использовать $ scope. $ Apply по двум причинам ... 1) возможно, он уже находится в цикле дайджеста, поэтому я могу получить ошибку, и 2) я пытаюсь избежать $ scope, чтобы помочь в дальнейшей миграциидо углового 2 +
Я пробовал несколько разных методов, но большинство из них вернулось к $ timeout.Как я понял, если вы используете $ timeout, он должен запускать все, что вы положили внутрь (после любого цикла дайджеста, который уже может быть запущен), а затем запускать $ apply после вашей функции, а затем продолжать любые обещанные вызовы, которые у вас есть.Так что должно быть что-то вроде этого (согласно моему пониманию) ...
$timeout(() => {
// this get's executed after current digest cycle if already running.
this.someBinding = newValue;
}).then(() => {
// this should execute after the original timeout func, and after a $scope.$apply() call has been made inbetween.
measureTheScreen();
})
Проблема, которую я имею, заключается в том, что функция тайм-аута, похоже, не работает так.Часть «then» вызывается до $ scope. $ Apply () Таким образом, элементы еще предстоит визуализировать в пользовательском интерфейсе.
PS I am , пытаясь выяснить болееAngularjs способ привязать это к viewmodel, но так как это требует от браузера рендеринга реальных элементов, я нахожу борьбу, чтобы найти способ, который действительно немного проще, чем этот.