khusamov
@khusamov
ReactJS, NodeJS, TypeScript, Sencha ExtJS

Как правильно написать функцию видимости кнопки в Ангуляр 1, не вызывая бесконечный цикл $digest?

У меня в шаблоне вида есть кнопка:

<button ng-show="buttonAddFriendVisibled()">Добавить в друзья</button>


Она должна быть видна, если функция buttonAddFriendVisibled() возвращает true. Эта функция описана, соответственно, в контроллере вида:

// Определение видимости кнопки Добавить в друзья
$scope.buttonAddFriendVisibled = function() {
	return (
		$scope.authenticated.hasFriend(user)
			.then(function(hasFriend) { 
				return $scope.user.id != $scope.authenticated.id && !hasFriend; 
			})
	);
};


Как вы догадываетесь, там используется $http и $q.resolve, которые запускают $digest и все это приводит к бесконечному циклу:


angular.js:63 Uncaught Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: [[{"msg":"buttonAddFriendVisibled()","newVal":{},"oldVal":{}},{"msg":"buttonRemoveFriendVisibled()","newVal":{},"oldVal":{}}],[{"msg":"buttonAddFriendVisibled()","newVal":{},"oldVal":"<>"},{"msg":"buttonRemoveFriendVisibled()","newVal":{},"oldVal":"<>"}],[{"msg":"buttonAddFriendVisibled()","newVal":{},"oldVal":"<>"},{"msg":"buttonRemoveFriendVisibled()","newVal":{},"oldVal":"<>"}],[{"msg":"buttonAddFriendVisibled()","newVal":{},"oldVal":"<>"},{"msg":"buttonRemoveFriendVisibled()","newVal":{},"oldVal":"<>"}],[{"msg":"buttonAddFriendVisibled()","newVal":{},"oldVal":"<>"},{"msg":"buttonRemoveFriendVisibled()","newVal":{},"oldVal":"<>"}]]


Как мне сделать вычисление видимости кнопки, если видимость зависит от авторизованного пользователя?
  • Вопрос задан
  • 128 просмотров
Пригласить эксперта
Ответы на вопрос 2
Почитайте эти две статьи, полностью.
https://github.com/rwwagner90/angular-styleguide-es6
https://www.sitepoint.com/writing-angularjs-apps-u...

1) Слишком много лишних переменных в $scope
2) Нужно использовать ControllerAs
Ответ написан
Комментировать
@lega
Можно что-то типа такого, но лучше в сервис выдернуть или просто в отдельную ф-ю.
$scope.buttonAddFriendVisibled = (function(){
var result;
return function() {
  if(result != null) return result;
  result = false;
  var authenticated = $scope.authenticated;
    authenticated.hasFriend(user)
      .then(function(hasFriend) { 
        result = $scope.user.id != authenticated.id && !hasFriend; 
      })
  };
})();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы