Angulaire Matériel: md-saisie semi-automatique - comment masquer md-saisie semi-automatique-suggestions sur l'Entrée de l'événement?
J'ai md-autocomplete
:
<md-autocomplete
md-min-length="1"
ng-enter="presEnter();"
md-no-cache="true"
md-selected-item="selectedItem"
md-search-text="searchText"
md-items="item in querySearch(searchText)"
md-item-text="item.name"
placeholder="Search for a vegetable">
<span md-highlight-text="searchText">{{item.name}} :: {{item.type}}</span>
</md-autocomplete>
avec la directive: ng-enter
.
Mon objectif: Quand l'utilisateur appuie sur Enter
je veux cacher md-autocomplete-suggestions
déroulant
Je sais de HTML, j'ai en quelque sorte d'appel: $mdAutocompleteCtrl.hidden = true;
, mais n'ont aucune idée de comment l'utiliser $mdAutocompleteCtrl
dans le Contrôleur.
J'ai googlé et trouvé:
$timeout( function() { $scope.$$childHead.$mdAutocompleteCtrl.hidden = true; },100);
mais il n'y a pas de $mdAutocompleteCtrl
(au moins dans mon JS, uniquement en HTML et je ne sais pas son champ d'application)
Je joue avec ce exemple: type 'a' et après déroulante, appuyez sur Entrée.
Des idées?
OriginalL'auteur snaggs | 2015-08-06
Vous devez vous connecter pour publier un commentaire.
La
$mdAutocompleteCtrl
est placé comme une propriété sur la saisie semi-automatique de la portée de l'.Tout d'abord, vous avez besoin d'accéder à la saisie semi-automatique de l'élément. Une façon de le faire est de mettre un ID sur la saisie semi-automatique:
Alors vous pouvez utiliser cet élément pour obtenir l'intérieur de la portée de la saisie semi-automatique. Parce que la saisie semi-automatique de l'élément lui-même est sur le champ que vous avez fournis, vous aurez envie d'obtenir le champ d'application de l'un de la saisie semi-automatique de ses éléments enfants.
Ici est un exemple: http://codepen.io/anon/pen/rVPZKN?editors=101
Donner à cet homme une des Cloches! Merci
Je suis totalement perdu. Je ne vois aucune différences
in action
. C'est juste une semaine, j'ai commencé à connaître le AngularJS. Quelqu'un peut-il me dire quelles sont les différences? Pas dans le code! J'ai joué avec tous les codes ici, mais les comportements sont les mêmes. MerciCette réponse utilise un contrôleur pour gérer appuyez sur entrée pour fermer la logique. Certains des autres réponses utilisez une directive qui est appliqué comme un attribut de la md-saisie semi-automatique de l'élément. Les deux options de travail donc je suppose que c'est une question de préférence. Si vous êtes cette nouvelle à AngularJS, alors vous devriez lire sur les contrôleurs et les directives. Aussi, à moins que vous ayez une bonne raison d'apprendre AngularJS, vous devriez probablement à ce point en apprendre le plus récent Angulaire ou un autre cadre. AngularJS est vieux et sont inférieures à la dernière version des bibliothèques.
OriginalL'auteur James
TLDR: Exemple de code qui déclenche cacher http://codepen.io/anon/pen/mJvGzp?editors=101
Le Problème(s):
Tout d'abord, le "Angulaire Façon" suggère que la manipulation de directives dans votre Contrôleur doit être évitée. Le Contrôleur doit essentiellement juste de le récupérer (via les Services, etc.) et de fournir les données nécessaires à la construction de la vue; il doit généralement éviter de se soucier exactement ce que la façon dont ces points de vue sont mis en place (c'est à dire qu'il devrait ne sais pas ce que les directives seront utilisés). Il existe plusieurs bonnes raisons pour cela, peut-être que cela rend la vie beaucoup plus facile lorsque vous souhaitez modifier la vue, tels que la permutation des directives.
Si des directives ont vraiment besoin d'être modifié manuellement, il est préférable de le faire à partir d'une autre directive. Cela permet plus de souplesse, et simplifie la maintenance plus tard (même exemple: si le remplacement pour les différentes directives de saisie semi-automatique).
Aussi, bien qu'il semble être le seul moyen de résoudre le problème dans ce cas, le
$scope.$$childHead.$mdAutocompleteCtrl.hidden
code semble assez hacky - à moins qu'il n'y a pas d'autre choix, il convient d'éviter d'accéder à des propriétés de départ avec$$
, et aussi d'éviter la modification de la fratrie directives sans le faire via partagé propriétés de portée.Malheureusement, après de creuser dans le code source ( sur le branche master ), je ne pouvais pas trouver tout de mieux que de déclencher la fonction masquer que, comme vous l'avez suggéré) à saisir la portée et de modifier le
hidden
propriété.Un autre problème avec l'accès via le Contrôleur, c'est que c'est un peu plus difficile parce qu'il est imbriqué au travers de quelques autres étendues. Vous pouvez transmettre l'événement, prenez le nœud DOM, et tirez vers le haut de son champ d'application, mais c'est beaucoup de chose sans pertinence dans un Contrôleur.
La Solution:
Donc, au lieu de cela, nous pouvons ajouter un frère ou d'une directive, semblable à la
ngEnter
exemple de directive que vous avez inclus dans le Codepen exemple. Peut-être quelque chose d'un peu plus explicite, de sorte que c'est un peu plus évident de ce qu'il fait:Le HTML serait tout simplement d'inclure cette directive, lorsque cela est pertinent:
Voici l'exemple modifié, avec en action: http://codepen.io/anon/pen/mJvGzp?editors=101
Il y a beaucoup de mots dans le post, mais le code est assez succincte. Les mots ont été pour commencer à expliquer le pourquoi du Contrôleur est au mauvais endroit (la séparation des préoccupations: directives pour l'INTERFACE utilisateur, le Contrôleur de logique métier). Je suis d'accord que vous êtes tout à fait correct dans l'évaluation que la bibliothèque, Angulaire du Matériel, devrait donner plus de crochets pour cela. 🙂
OriginalL'auteur DRobinson
Je pense que cette solution est préférable car:
il utilise une directive au lieu du contrôleur.
c'est plus simple que les autres compte tenu de la directive solution.
Javascript
HTML
OriginalL'auteur gilad mayani
La meilleure façon d'accéder à des méthodes du controller est de cibler l'élément et ensuite utiliser le jqLite objet pour accéder au contrôleur:
Chaque fois que vous accéder à n'importe quoi à l'aide de la
scope()
méthode sur angulaire de l'élément, votre application va casser si jamais vous souhaitez désactiver angulaire des informations de débogage.OriginalL'auteur smola
Si vous ne me dérange pas de perdre le focus sur le md-saisie semi-automatique de l'élément d'entrée sur entrée, vous pouvez fermer md-suggestions de saisie semi-automatique sans l'aide de hacky d'une manière qui implique de jouer avec le interne
$mdAutocompleteCtrl
contrôleur. Cela dépend md-saisie semi-automatique pour cacher automatiquement les suggestions lorsque l'élément d'entrée n'est plus.ng-enter
) et ajouter un ID de l'élément d'entrée à l'aide de md-entrée-idblur()
sur le#autocomplete
l'élément d'entréeOriginalL'auteur WeNeigh