Лучший способ запуска AngularJS ng-show
Я создаю блок автозаполнения в AngularJS. Соответствующий код выглядит следующим образом
<input type="text" ng-model="tag">
<div ng-show="tag">
<ul>
<li ng-repeat="t in user.tags | filter:{name:tag}">
<a>{{t.name}}</a>
</li>
</ul>
</div>
Я хотел бы знать, что лучший способ показать список предложений, когда "тег" не имеет значения (т.е. я хочу показать все теги, когда пользователь нажимает клавишу "вниз". Не нужно упоминать нажатия клавиш код ответа).
Ответы
Ответ 1
ng-show работает с любым выражением, которое приводит к bool, поэтому все, что вам нужно сделать, это заменить "тег" на "tag ===" или на эквивалент, если ваш тег будет undefined или null.
Если вы хотите показать только, когда нажата определенная клавиша, я бы создал другую переменную, которую вы установили в true, когда нажата клавиша вниз, и проверьте это, например.
$scope.KeyPressed = false;
$scope.Tags = '';
$scope.ShowTags = function () {
return $scope.KeyPressed && $scope.Tags !== '';
};
Затем в вас div:
<div ng-show="ShowTags()">
См. jsfiddle, например
Если вам нужно изменить какую-либо переменную из плагина jquery, вам может потребоваться использовать
$scope.$apply()
Ответ 2
Я столкнулся с этим вопросом, когда я сам создавал проект angular.
Когда я принял принятый ответ, я обнаружил, что мой браузер продолжает увеличиваться в памяти. Если вы создали метод видимости angular "ShowTags()", это будет непрерывно получать опрос. Вы можете проверить это, установив точку останова в этом методе, и он будет постоянно получать удар. Если вы проверите диспетчер задач и покажете браузер, на котором запущен ваш сайт, память продолжает расти и не останавливается.
По моему мнению, функции области должны использоваться только при использовании триггеров событий: событие click, change event, keypressed - некоторые из примеров.
показ или скрытие не являются событиями, поэтому именно поэтому он получает такой ответ.
Чтобы исправить и предоставить ту же функциональность, превратите это в переменную области видимости.
измените тег html:
<div ng-show="ShowTags()">
к
<div ng-show="ShowTags">
И в вашем контроллере:
$scope.KeyPressed = false;
$scope.Tags = '';
then create a watch event on what you want to watch for:
//initialize showtag when page loads
$scope.ShowTag = $scope.KeyPressed && $scope.Tags !== '';
//watch for any new changes on keypressed
$scope.$watch('KeyPressed', function (newValue, oldValue) {
if (newValue && $scope.Tags !== '') {
$scope.ShowTag = true;
} else {
$scope.ShowTag = false;
}
}
//watch for any new changes on keypressed
$scope.$watch('Tags', function (newValue, oldValue) {
if (newValue !== "" && $scope.KeyPressed) {
$scope.ShowTag = true;
} else {
$scope.ShowTag = false;
}
}
Или вы можете перейти на "watchCollection" вместо нескольких часов, например:
$watchCollection('[KeyPressed, Tags]', function (newValue) { }
но с этим, newValue будет массивом, и вам нужно будет получить доступ к конкретным индексам, чтобы получить новыеValues любой переменной, за которой просматривается.
like.. newValue [0] - значение KeyPressed, а newValue [1] - значение тегов
Или согласиться с принятым ответом и свести к минимуму количество часов:
$scope.TruthyVal= function () {
return $scope.KeyPressed && $scope.Tags !== '';
};
$scope.$watch('TruthyVal', function (newValue, oldValue) {
if (newValue) {
$scope.ShowTag = true;
} else {
$scope.ShowTag = false;
}
}
который смотрит на значения KeyPressed и теги и изменяет значение TruthyVal. Если TruthyVal изменен, он переходит в наблюдаемую логику.