Maison >interface Web >js tutoriel >Création d'un widget Typeahead avec AngularJS - SitePoint
<span>var typeAhead = angular.module('app', []); </span> typeAhead<span>.factory('dataFactory', function($http) { </span> <span>return { </span> <span>get: function(url) { </span> <span>return $http.get(url).then(function(resp) { </span> <span>return resp.data; // success callback returns this </span> <span>}); </span> <span>} </span> <span>}; </span><span>});</span>Le code précédent crée une usine appelée DataFactory qui récupère les données JSON d'une API. Nous n'entrerons pas dans les détails de l'usine, mais nous devons comprendre brièvement le fonctionnement du service $ http. Vous transmettez une URL à la fonction get (), qui renvoie une promesse. Un autre appel à alors () sur cette promesse renvoie également une autre promesse (nous renvoyons cette promesse de la fonction get () de l'usine). Cette promesse est résolue avec la valeur de retour du succès transmis à alors (). Donc, à l'intérieur de notre contrôleur, nous n'interagissons pas directement avec $ http. Au lieu de cela, nous demandons une instance d'usine dans le contrôleur et appelons sa fonction get () avec une URL. Ainsi, notre code de contrôleur qui interagit avec l'usine ressemble à ceci:
typeAhead<span>.controller('TypeAheadController', function($scope<span>, dataFactory</span>) { // DI in action </span> dataFactory<span>.get('states.json').then(function(data) { </span> $scope<span>.items = data; </span> <span>}); </span> $scope<span>.name = ''; // This will hold the selected item </span> $scope<span>.onItemSelected = function() { // this gets executed when an item is selected </span> <span>console.log('selected=' + $scope.name); </span> <span>}; </span><span>});</span>Le code précédent utilise un point de terminaison API appelé states.json qui renvoie une liste JSON des États américains. Lorsque les données sont disponibles, nous stockons la liste dans les éléments du modèle de portée. Nous utilisons également le nom du modèle pour maintenir l'élément sélectionné. Enfin, la fonction OnItemSelected () est exécutée lorsque l'utilisateur sélectionne un état particulier.
typeAhead<span>.directive('typeahead', function($timeout) { </span> <span>return { </span> <span>restrict: 'AEC', </span> <span>scope: { </span> <span>items: '=', </span> <span>prompt: '@', </span> <span>title: '@', </span> <span>subtitle: '@', </span> <span>model: '=', </span> <span>onSelect: '&' </span> <span>}, </span> <span>link: function(scope<span>, elem, attrs</span>) { </span> <span>}, </span> <span>templateUrl: 'templates/templateurl.html' </span> <span>}; </span><span>});</span>Dans la directive, nous créons une portée isolée qui définit plusieurs propriétés:
<span>var typeAhead = angular.module('app', []); </span> typeAhead<span>.factory('dataFactory', function($http) { </span> <span>return { </span> <span>get: function(url) { </span> <span>return $http.get(url).then(function(resp) { </span> <span>return resp.data; // success callback returns this </span> <span>}); </span> <span>} </span> <span>}; </span><span>});</span>
typeAhead<span>.controller('TypeAheadController', function($scope<span>, dataFactory</span>) { // DI in action </span> dataFactory<span>.get('states.json').then(function(data) { </span> $scope<span>.items = data; </span> <span>}); </span> $scope<span>.name = ''; // This will hold the selected item </span> $scope<span>.onItemSelected = function() { // this gets executed when an item is selected </span> <span>console.log('selected=' + $scope.name); </span> <span>}; </span><span>});</span>Tout d'abord, nous rendons un champ de texte d'entrée où l'utilisateur tapera. L'invite de propriété de portée est affectée à l'attribut d'espace réservé. Ensuite, nous parcourons la liste des états et affichons les propriétés du nom et de l'abréviation. Ces noms de propriétés sont configurés via les propriétés du titre et des sous-titres. Les directives NG-MouseEnter et NG-Class sont utilisées pour mettre en évidence l'entrée lorsqu'un utilisateur plane avec la souris. Ensuite, nous utilisons Filtre: Model, qui filtre la liste par le texte entré dans le champ de saisie. Enfin, nous avons utilisé la directive NG-Hide pour masquer la liste lorsque le champ de texte d'entrée est vide ou que l'utilisateur a sélectionné un élément. La propriété sélectionnée est définie sur true à l'intérieur de la fonction handleselection () et définie sur False False (pour afficher la liste des suggestions) lorsque quelqu'un commence à taper dans le champ de saisie.
typeAhead<span>.directive('typeahead', function($timeout) { </span> <span>return { </span> <span>restrict: 'AEC', </span> <span>scope: { </span> <span>items: '=', </span> <span>prompt: '@', </span> <span>title: '@', </span> <span>subtitle: '@', </span> <span>model: '=', </span> <span>onSelect: '&' </span> <span>}, </span> <span>link: function(scope<span>, elem, attrs</span>) { </span> <span>}, </span> <span>templateUrl: 'templates/templateurl.html' </span> <span>}; </span><span>});</span>La fonction mancheleselection () met à jour la propriété Scope, modèle, avec le nom de l'état sélectionné. Ensuite, nous réinitialisons les propriétés actuelles et sélectionnées. Ensuite, nous appelons la fonction onSelect (). Un délai est ajouté car l'affectation Scope.Model = SelectedItem ne met pas immédiatement à jour la propriété de portée du contrôleur lié. Il est souhaitable d'exécuter la fonction de rappel de la portée du contrôleur après la mise à jour du modèle avec l'élément sélectionné. C’est la raison pour laquelle nous avons utilisé un service de temps mort $. De plus, les fonctions isCurrent () et setCurrent () sont utilisées ensemble dans le modèle pour mettre en évidence les entrées de la suggestion complète automatique. Le CSS suivant est également utilisé pour terminer le processus de surbrillance.
<span>{ </span> <span>"name": "Alabama", </span> <span>"abbreviation": "AL" </span><span>}</span>
<span><span><span><input</span> type<span>="text"</span> ng-model<span>="model"</span> placeholder<span>="{{prompt}}"</span> ng-keydown<span>="selected=false"</span> /></span> </span><span><span><span><br</span>/></span> </span> <span><span><span><div</span> class<span>="items"</span> ng-hide<span>="!model.length || selected"</span>></span> </span> <span><span><span><div</span> class<span>="item"</span> ng-repeat<span>="item in items | filter:model track by $index"</span> ng-click<span>="handleSelection(item[title])"</span> <span>style<span>="<span>cursor:pointer</span>"</span></span> ng-class<span>="{active:isCurrent($index)}"</span> ng-mouseenter<span>="setCurrent($index)"</span>></span> </span> <span><span><span><p</span> class<span>="title"</span>></span>{{item[title]}}<span><span></p</span>></span> </span> <span><span><span><p</span> class<span>="subtitle"</span>></span>{{item[subtitle]}}<span><span></p</span>></span> </span> <span><span><span></div</span>></span> </span><span><span><span></div</span>></span></span>
La personnalisation de l'apparence de la liste déroulante Typeahead peut être réalisée en utilisant CSS. Vous pouvez cibler le menu déroulant en utilisant la classe .Dropdown-menu. Par exemple, si vous souhaitez modifier la couleur de l'arrière-plan et la couleur de la police, vous pouvez utiliser le code CSS suivant:
.Dropdown-menu {
background-Color: # f8f9fa;
couleur: # # 343A40;
}
N'oubliez pas d'inclure ce CSS dans votre fichier CSS principal ou dans les balises
limitant le nombre de suggestions dans la liste déroulante Typeahead peut être effectuée en utilisant l'attribut Typeahead-Min-Lingment. Cet attribut spécifie le nombre minimum de caractères qui doivent être entrés avant que Typeahead ne commence à se lancer.
comment puis-je utiliser une fonctionnalité de sélection d'objets avec TypeAl?
$ scope.onselect = fonction (élément, modèle, étiquette) {
// faire quelque chose avec l'élément sélectionné
};
comment puis-je utiliser Typeahead avec bootstrap dans AngularJS?
Dans cet exemple, les états sont un tableau d'états, $ ViewValue est la valeur saisie par l'utilisateur et limite: 8 limite le nombre de suggestions à 8.
comment puis-je utiliser la tact avec des données distantes en Angularjs?
return $ http.get ('/ api / states', {
params: {
name: val
}
}). Puis (fonction (réponse) {
return réponse.data.map (fonction (item) {
return item.name;
});
});
};
Dans votre html, vous pouvez utiliser la fonction GetStates comme ceci:
Dans cet exemple, GetStates est une fonction qui récupère les états à partir d'un serveur distant en fonction de la valeur saisie par le utilisateur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!