AngularJS : Comment utiliser $http dans un filtre
Je voudrais faire une demande à mon backend dans un filtre et de retourner le résultat de ma demande.
Le problème, c'est le service $http retour d'une promesse et c'est le problème.
Pour présenter la question, j'ai utilisé un $timeout et les promesses de angulaire dans mon violon :
mon violon
Dans mon filtre j'ai utiliser un $timeout avec une promesse, mais l'objectif final est d'utiliser une requête http :
myApp.filter('filterHello', function ($http,$timeout,$q) {
return function (company_id) {
console.log("in the filter");
var deferred = $q.defer();
$timeout(function() {
deferred.resolve("ca marche");
}, 2000);
return deferred.promise;
};
});
Alors, à mon avis, je utiliser mon filtre qui est supposé afficher "ca marche", avec un retard de 2 secondes, mais cela ne fonctionne pas :
<div ng-controller="MyCtrl">
{{hello|filterHello}}
</div>
Vous pouvez voir que le filtre de retour rien et qu'il y a une boucle infinie dans le filtre en raison de l'nulle promesse, je pense.
Si vous ne comprenez pas pourquoi je veux utiliser une requête http dans un filtre, la réponse est simple.
Pour exemple, j'ai un objet utilisateur avec les champs : email,nom,company_id..
Et j'ai un autre objet de l'entreprise avec les champs : nom, createOn,...
Je voudrais utiliser le filtre de ce genre pour afficher le nom de l'utilisateur de l'entreprise :
{{utilisateur.company_id | ShowNameCompany}}
Donc, j'ai besoin de faire une requête http dans le filtre de ma société contrôleur de mon backend.
J'espère que quelqu'un pourra m'aider.
- Poste le code que vous avez essayé merci
- Lien de votre violon
- Les filtres de feu BEAUCOUP! Il doit y avoir une bande passante plus convivial méthode de réalisation de votre objectif.
- Le violon, le lien ne s'affiche pas car il a un
[2]:
en face d'elle. Et encore, sur ce, vous ne pouvez pas poster un lien vers jsfiddle.net sans ajouter également un peu de code à votre question. S'il vous plaît ajouter un peu de code et assurez-vous que le lien est correct. Merci. - Quel est l'objectif de la fin ici? Pourquoi êtes-vous à l'aide de $http dans les filtres en premier lieu?
- Oui désolé j'ai corrigé le lien pour le violon. Mike je suis d'accord avec vous, mais si j'utilise le cache pour ma demande, je vais faire une seule demande et obtenez les données dans le cache
- Je viens de mettre à jour mon post où j'explique mon objectif.
- Votre mise à jour le fait ressembler vous devez créer une directive, pas un filtre.
Vous devez vous connecter pour publier un commentaire.
Je pense que vous ne devriez pas utiliser les filtres de cette façon. Les filtres sont pour la transformation des données fondées sur l'option paramètres.
Le problème, c'est que vous êtes immédiatement en retour d'une promesse de la fonction de filtre. Et ce n'est rien Angulaire peut traiter comme un résultat d'un filtre.
Ma suggestion serait donc cette - récupère le résultat de la première, de travailler avec le filtre basé sur le résultat:
et dans le Modèle:
Edit: Viens de lire votre explication. Pour moi, ce serait un candidat pour une directive:
et dans le modèle:
Si vous avez beaucoup d'entreprises, vous devez charger les noms (peut-être les envoyer avec la première réponse, d'abord?), comme vous pouvez vous en être les bombardements de votre serveur un peu avec les demandes.
Ou vous pouvez utiliser un filtre dynamique:
et de l'utiliser comme ceci:
{{company_id | companyName}}
Attention: La fonction companyNameFilter sera appelé sur chaque digérer cycle.
Aussi, vous aurez besoin de trouver un moyen de réinitialiser le cache si il devient trop gros.
Voir: https://glebbahmutov.com/blog/async-angular-filter/
Et la plunker (le lien ci-dessus ne s'affiche pas, donc voici un lien direct): http://plnkr.co/edit/EK2TYI1NZevojOFDpaOG?p=preview
{{company_id | companyName}}
, cependant, utilisez ce filtre personnalisé dans un contrôleur? Dans le contrôleur de construction commeconsole.log('ctrl Filter:', $filter('companyName')($scope.company_id));
ne fonctionne pas! Peut-être quelqu'un pourrait résoudre aussi pour les autres, non seulement en vue. meilleures salutationsSi vous devez faire une requête http à l'intérieur d'un filtre que j'ai aussi trouvé une raison à récemment, puis procédez comme indiqué ci-dessous.
Noter que l'Angulaire de l'équipe décourage l'utilisation de la dynamique des filtres que je cite à partir de leur documentation
Par cette recommandation, voici ce que vous devez faire:
Déclarer votre filtre de sorte qu'il accepte un objet de l'étendue, comme c'est le premier paramètre:
la fonction de filtre($http) {
Définir une variable qui sera disponible dans le cadre de votre modèle. Je vais appeler le mien filterCache et affecter et d'objet vide {} à elle.
Invoquer le filtre à partir de l'intérieur de votre modèle comme celui-ci: