Existe-t-il un moyen d'utiliser les fonctions mathématiques dans les liaisons AngularJS?
par exemple
<p>The percentage is {{Math.round(100*count/total)}}%</p>
Ce violon montre le problème
Existe-t-il un moyen d'utiliser les fonctions mathématiques dans les liaisons AngularJS?
par exemple
<p>The percentage is {{Math.round(100*count/total)}}%</p>
Ce violon montre le problème
<p>The percentage is {{(100*count/total)| number:0}}%</p>
plus dans les commentaires ci-dessous.private Math = Math;
et vous pouvez l'utiliser.Réponses:
Vous devez injecter
Math
dans votre portée, si vous avez besoin de l'utiliser car vous$scope
ne savez rien des mathématiques.Le moyen le plus simple, vous pouvez le faire
dans votre contrôleur. Une manière angulaire de le faire correctement serait de créer un service Math, je suppose.
la source
formatting
, utilisez plutôt le filtre.Alors que la réponse acceptée est juste que vous pouvez injecter
Math
pour l'utiliser en angulaire, pour ce problème particulier, la manière la plus conventionnelle / angulaire est le filtre numérique:Vous pouvez en savoir plus sur le
number
filtre ici: http://docs.angularjs.org/api/ng/filter/numberla source
{{1234.567|number:2}}
s'affiche comme1,234.57
ou1 234,57
. Si vous essayez de le transmettre,<input type="number" ng-value="1234.567|number:2">
vous videz l'entrée, car la valeur N'EST PAS UN NUMÉRO CORRECT, mais une représentation sous forme de chaîne dépendante des paramètres régionaux.Je pense que la meilleure façon de le faire est de créer un filtre, comme ceci:
alors le balisage ressemble à ceci:
Violon mis à jour: http://jsfiddle.net/BB4T4/
la source
C'est une question velue à laquelle répondre, car vous n'avez pas donné le contexte complet de ce que vous faites. La réponse acceptée fonctionnera, mais dans certains cas, entraînera de mauvaises performances. Ça, et ça va être plus difficile à tester.
Si vous faites cela dans le cadre d'une forme statique, très bien. La réponse acceptée fonctionnera, même si elle n'est pas facile à tester et qu'elle est hinky.
Si vous voulez être "angulaire" à ce sujet:
Vous voudrez garder toute "logique métier" (c'est-à-dire la logique qui modifie les données à afficher) hors de vos vues. Cela vous permet de tester votre logique à l'unité et de ne pas coupler étroitement votre contrôleur et votre vue. Théoriquement, vous devriez pouvoir pointer votre contrôleur vers une autre vue et utiliser les mêmes valeurs des étendues. (si ça a du sens).
Vous voudrez également considérer que tout appel de fonction à l'intérieur d'une liaison (comme
{{}}
oung-bind
oung-bind-html
) devra être évalué à chaque résumé , car angular n'a aucun moyen de savoir si la valeur a changé ou non comme avec une propriété sur la portée.La manière "angulaire" de procéder serait de mettre en cache la valeur d'une propriété sur la portée lors du changement en utilisant un événement ng-change ou même un $ watch.
Par exemple avec un formulaire statique:
Et maintenant, vous pouvez le tester!
la source
$window
car il semble fonctionner avec juste un planMath.round()
?Math
tests. Alternativement, vous pouvez créer un service Math et l'injecter.Pourquoi ne pas envelopper tout l'objet mathématique dans un filtre?
et utiliser:
{{number_var | math: 'ceil'}}
la source
La meilleure option consiste à utiliser:
Il définit la valeur par défaut de l'équation à 0 dans le cas où les valeurs ne sont pas initialisées.
la source
Si vous cherchez à faire un simple tour en angulaire, vous pouvez facilement définir le filtre à l'intérieur de votre expression. Par exemple:
{{ val | number:0 }}
Voir cet exemple CodePen & pour d'autres options de filtre numérique.
Documents angulaires sur l'utilisation des filtres numériques
la source
La façon la plus simple de faire des calculs simples avec Angular est directement dans le balisage HTML pour les liaisons individuelles selon les besoins, en supposant que vous n'avez pas besoin de faire des calculs de masse sur votre page. Voici un exemple:
Dans ce cas, il vous suffit de faire le calcul dans le () puis d'utiliser un filtre | pour obtenir une réponse numérique. Voici plus d'informations sur la mise en forme des nombres angulaires sous forme de texte:
https://docs.angularjs.org/api/ng/filter
la source
Soit liez l'objet Math global sur la portée (n'oubliez pas d'utiliser $ window not window)
Utilisez la liaison dans votre HTML:
Ou créez un filtre pour la fonction mathématique spécifique que vous recherchez:
Utilisez le filtre dans votre HTML:
la source
Cela ne ressemble pas à une façon très angulaire de le faire. Je ne sais pas exactement pourquoi cela ne fonctionne pas, mais vous auriez probablement besoin d'accéder à la portée afin d'utiliser une fonction comme celle-ci.
Ma suggestion serait de créer un filtre. C'est la voie angulaire.
Ensuite, dans votre code HTML, procédez comme suit:
la source
Le
number
filtre formate le nombre avec des milliers de séparateurs, ce n'est donc pas strictement une fonction mathématique.De plus, son «limiteur» décimal n'a pas
ceil
de décimales hachées (comme certaines autres réponses le laisseraient croire), mais plutôtround
les.Donc, pour n'importe quelle fonction mathématique que vous voulez, vous pouvez l'injecter (plus facile à simuler que d'injecter tout l'objet Math) comme ceci:
Pas besoin non plus de l'envelopper dans une autre fonction.
la source
Il s'agit plus ou moins d'un résumé de trois réponses (par Sara Inés Calderón, klaxon et Gothburz), mais comme elles ont toutes ajouté quelque chose d'important, je considère qu'il vaut la peine de rejoindre les solutions et d'ajouter quelques explications.
Compte tenu de votre exemple, vous pouvez effectuer des calculs dans votre modèle en utilisant:
Cependant, cela peut entraîner un grand nombre de décimales, donc l' utilisation de filtres est une bonne façon de procéder:
Par défaut, le filtre numérique laisse jusqu'à trois chiffres fractionnaires , c'est là que l' argument fractionSize est assez pratique (
{{ 100 * (count/total) | number:fractionSize }}
), ce qui dans votre cas serait:Cela arrondira également déjà le résultat:
Afficher l'extrait de code
Dernière chose à mentionner, si vous comptez sur une source de données externe, il est probablement judicieux de fournir une valeur de secours appropriée (sinon vous pouvez voir NaN ou rien sur votre site):
Sidenote: En fonction de vos spécifications, vous pouvez même être plus précis avec vos solutions de secours / définir des solutions de secours à des niveaux inférieurs déjà (par exemple
{{(100 * (count || 10)/ (total || 100) | number:2)}}
). Cependant, cela peut ne pas toujours avoir de sens ..la source
Exemple de typographie angulaire utilisant un tuyau.
math.pipe.ts
Ajouter aux déclarations @NgModule
puis utilisez dans votre modèle comme ceci:
la source