Я пытаюсь ограничить вызов ng-hide/ng-show. В настоящее время он вызывает функцию getLicense несколько раз, которая будет перегружать браузер.
$scope.getLicense = function( value ) {
if( $sessionStorage.license === '' ) {
DashboardService.getLicense( ).then( function( data ) {
$scope.licenses = data;
var arr = [ ],
id = '';
for( var i in $scope.licenses ) {
arr.push( [ i ] );
}
$sessionStorage.license = arr;
} );
for( var cnt = 0; cnt < $sessionStorage.license.length; cnt++ ) {
if( $sessionStorage.license[ cnt ] == value ) {
console.log( 'true' );
return true;
break;
} else {
return false;
break;
}
}
} else {
for( var cnt = 0; cnt < $sessionStorage.license.length; cnt++ ) {
if( $sessionStorage.license[ cnt ] == value ) {
console.log('true');
return true;
break;
} else {
console.log('false');
return false;
break;
}
}
}
};
Мой код HTML выглядит так:
<md-list-item class="md-caption" ng-class="{'active': $state.includes('security.webcontrol')}" translate="SIDEBAR.NAV.WEBCONTROL.TITLE" ng-hide="getLicense('web_control_da')">
Предоставление функции ng-show
/hide
/if
/etc - очень плохая практика.
Каждый раз, когда вызывается $digest
(очень часто), он проверяет каждого наблюдателя, чтобы увидеть, изменилось ли оно. Поэтому вам нужно будет выполнить свою функцию, чтобы узнать, отличается ли результат (или нет).
Добавьте в свою функцию getLicense
console.log('function executed')
и вы увидите, как часто она вызывается.
Чтобы избежать этого (как объяснил Icycool), вы должны заменить его логическим в своей области. И только измените логическое значение, когда getLicense
должен быть протестирован.
Например: Если getLicense
нужно вычислять каждый раз $sessionStorage.license
изменении $sessionStorage.license
(например):
$scope.licence = getLicense();
$scope.watch("$sessionStorage.license", function (newValue, oldValue){
$scope.licence = getLicense();
});
И в вашем представлении/шаблоне: ng-hide="licence"
Таким образом, он будет выполнять ваш getLicense
только тогда, когда это действительно имеет значение.
Вы можете назначить его переменной области видимости и вместо нее указать ng-hide
. Лицензия на проверку звонков в других случаях.