¿Hay alguna manera de usar funciones matemáticas en enlaces AngularJS?
p.ej
<p>The percentage is {{Math.round(100*count/total)}}%</p>
Este violín muestra el problema
¿Hay alguna manera de usar funciones matemáticas en enlaces AngularJS?
p.ej
<p>The percentage is {{Math.round(100*count/total)}}%</p>
Este violín muestra el problema
<p>The percentage is {{(100*count/total)| number:0}}%</p>
más en el comentario a continuación.private Math = Math;
y puede usarlo.Respuestas:
Debe inyectar
Math
en su ámbito, si necesita usarlo, ya$scope
que no sabe nada sobre matemáticas.De la manera más simple, puedes hacer
en su controlador Supongo que una forma angular de hacer esto correctamente sería crear un servicio matemático.
fuente
formatting
, así que use filtro en su lugarSi bien la respuesta aceptada es correcta, puede inyectarla
Math
para usarla en angular, para este problema en particular, la forma más convencional / angular es el filtro de números:Puede leer más sobre el
number
filtro aquí: http://docs.angularjs.org/api/ng/filter/numberfuente
{{1234.567|number:2}}
se representa como1,234.57
o1 234,57
. Si intenta pasarlo<input type="number" ng-value="1234.567|number:2">
, vaciará la entrada, ya que el valor NO ES UN NÚMERO CORRECTO, sino una representación de cadena dependiente de la configuración regional.Creo que la mejor manera de hacerlo es creando un filtro, como este:
entonces el marcado se ve así:
Violín actualizado: http://jsfiddle.net/BB4T4/
fuente
Esta es una pregunta difícil de responder, porque no dio el contexto completo de lo que está haciendo. La respuesta aceptada funcionará, pero en algunos casos causará un bajo rendimiento. Eso, y va a ser más difícil de probar.
Si está haciendo esto como parte de una forma estática, está bien. La respuesta aceptada funcionará, incluso si no es fácil de evaluar, y es extraña.
Si quieres ser "Angular" sobre esto:
Querrá mantener cualquier "lógica de negocios" (es decir, lógica que altere los datos que se mostrarán) fuera de sus vistas. Esto es para que pueda probar su lógica de forma unitaria, y para que no termine estrechamente acoplando su controlador y su vista. Teóricamente, debería poder apuntar su controlador a otra vista y usar los mismos valores de los ámbitos. (Si eso tiene sentido).
También querrá tener en cuenta que cualquier función llamada dentro de un enlace (como
{{}}
ong-bind
ong-bind-html
) tendrá que evaluarse en cada resumen , porque angular no tiene forma de saber si el valor ha cambiado o no como lo haría con una propiedad en el alcance.La forma "angular" de hacer esto sería almacenar en caché el valor de una propiedad en el alcance del cambio utilizando un evento ng-change o incluso un $ watch.
Por ejemplo con una forma estática:
¡Y ahora puedes probarlo!
fuente
$window
ya que parece funcionar solo con el planMath.round()
?Math
pruebas. Alternativamente, puede crear un servicio matemático e inyectarlo.¿Por qué no envolver todo el obj matemático en un filtro?
y para usar:
{{number_var | matemática: 'ceil'}}
fuente
La mejor opción es usar:
Establece el valor predeterminado de la ecuación en 0 en el caso de que los valores no se inicialicen.
fuente
Si está buscando hacer una ronda simple en Angular, puede configurar fácilmente el filtro dentro de su expresión. Por ejemplo:
{{ val | number:0 }}
Vea este ejemplo de CodePen y para otras opciones de filtro de números.
Documentos angulares sobre el uso de filtros de números
fuente
La forma más fácil de hacer cálculos matemáticos simples con Angular es directamente en el marcado HTML para enlaces individuales según sea necesario, suponiendo que no necesite hacer cálculos masivos en su página. Aquí hay un ejemplo:
En este caso, solo hace los cálculos en () y luego usa un filtro | para obtener una respuesta numérica Aquí hay más información sobre cómo formatear números angulares como texto:
https://docs.angularjs.org/api/ng/filter
fuente
Puede vincular el objeto matemático global al ámbito (recuerde usar $ window, no window)
Use el enlace en su HTML:
O cree un filtro para la función matemática específica que busca:
Usa el filtro en tu HTML:
fuente
Eso no parece una forma muy angular de hacerlo. No estoy completamente seguro de por qué no funciona, pero es probable que necesite acceder al alcance para usar una función como esa.
Mi sugerencia sería crear un filtro. Esa es la forma angular.
Luego en tu HTML haz esto:
fuente
El
number
filtro formatea el número con miles de separadores, por lo que no es estrictamente una función matemática.Además, su 'limitador' decimal no tiene
ceil
decimales cortados (como algunas otras respuestas lo llevarían a creer), sino más bien su respuestaround
.Entonces, para cualquier función matemática que desee, puede inyectarla (más fácil de burlarse que inyectar todo el objeto matemático) de esta manera:
No es necesario envolverlo en otra función tampoco.
fuente
Esto es más o menos un resumen de tres respuestas (por Sara Inés Calderón, klaxon y Gothburz), pero como todos agregaron algo importante, considero que vale la pena unir las soluciones y agregar más explicaciones.
Considerando su ejemplo, puede hacer cálculos en su plantilla usando:
Sin embargo, esto puede resultar en una gran cantidad de decimales, por lo que usar filtros es una buena manera de hacerlo:
Por defecto, el filtro de números dejará hasta tres dígitos fraccionarios , aquí es donde el argumento fraccionSize resulta bastante útil (
{{ 100 * (count/total) | number:fractionSize }}
), que en su caso sería:Esto también redondeará el resultado ya:
Mostrar fragmento de código
Lo último que hay que mencionar, si confía en una fuente de datos externa, probablemente sea una buena práctica proporcionar un valor de reserva adecuado (de lo contrario, puede ver NaN o nada en su sitio):
Nota al margen: Dependiendo de sus especificaciones, incluso puede ser más preciso con sus retrocesos / definir retrocesos en niveles más bajos (por ejemplo
{{(100 * (count || 10)/ (total || 100) | number:2)}}
). Sin embargo, esto no siempre tiene sentido.fuente
Ejemplo de mecanografía angular usando una tubería.
math.pipe.ts
Agregar a las declaraciones de @NgModule
luego use en su plantilla de la siguiente manera:
fuente