Есть ли способ использовать математические функции в привязках AngularJS?
например
<p>The percentage is {{Math.round(100*count/total)}}%</p>
Эта скрипка показывает проблему
Есть ли способ использовать математические функции в привязках AngularJS?
например
<p>The percentage is {{Math.round(100*count/total)}}%</p>
Эта скрипка показывает проблему
<p>The percentage is {{(100*count/total)| number:0}}%</p>
подробнее об этом ниже.private Math = Math;
и вы можете использовать его.Ответы:
Вы должны ввести
Math
в свой объем, если вам нужно использовать его, так как$scope
ничего не знаете о математике.Самый простой способ, вы можете сделать
в вашем контроллере. Я думаю, что угловой способ сделать это правильно - создать математический сервис.
источник
formatting
, поэтому используйте фильтр вместо.Хотя принятый ответ является правильным, вы можете
Math
использовать его в угловых значениях, но для этой конкретной проблемы более общепринятым / угловым способом является числовой фильтр:Вы можете прочитать больше о
number
фильтре здесь: http://docs.angularjs.org/api/ng/filter/numberисточник
{{1234.567|number:2}}
отображается как1,234.57
или1 234,57
. Если вы попытаетесь передать его<input type="number" ng-value="1234.567|number:2">
вам, то очистите входные данные, так как значение НЕ является ПРАВИЛЬНЫМ НОМЕРОМ, а зависит от локали.Я думаю, что лучший способ сделать это - создать фильтр, например так:
тогда разметка выглядит так:
Обновленная скрипка: http://jsfiddle.net/BB4T4/
источник
На этот вопрос сложно ответить, потому что вы не дали полного контекста того, что вы делаете. Принятый ответ будет работать, но в некоторых случаях это приведет к снижению производительности. Это, и это будет сложнее проверить.
Если вы делаете это как часть статической формы, хорошо. Принятый ответ сработает, даже если его нелегко проверить, и он обманчив.
Если вы хотите быть "Angular" по этому поводу:
Вы захотите сохранить любую «бизнес-логику» (т. Е. Логику, которая изменяет отображаемые данные) за пределами ваших представлений. Это сделано для того, чтобы вы могли модульно протестировать свою логику, и чтобы в итоге вы не связали свой контроллер с вашим взглядом. Теоретически, вы должны иметь возможность указать свой контроллер на другое представление и использовать те же значения из областей. (если это имеет смысл).
Вы также захотите учесть, что любые вызовы функций внутри привязки (например,
{{}}
илиng-bind
илиng-bind-html
) должны оцениваться при каждом дайджесте , потому что angular не может узнать, изменилось ли значение или нет, как это было бы для свойства по объему.«Угловой» способ сделать это состоял бы в том, чтобы кэшировать значение в свойстве в области изменения при помощи события ng-change или даже $ watch.
Например со статической формой:
И теперь вы можете проверить это!
источник
$window
что, кажется, работает только с планомMath.round()
?Math
тесты. С другой стороны, вы можете создать математический сервис и внедрить его.Почему бы не обернуть весь математический объект в фильтр?
и использовать:
{{number_var | математика: 'CEIL'}}
источник
Лучшим вариантом является использование:
Он устанавливает значение по умолчанию уравнения в 0 в случае, когда значения не инициализированы.
источник
Если вы хотите сделать простой раунд в Angular, вы можете легко установить фильтр внутри вашего выражения. Например:
{{ val | number:0 }}
Посмотрите этот пример CodePen & для других параметров фильтра чисел.
Угловые документы по использованию цифровых фильтров
источник
Самый простой способ сделать простую математику с Angular - это непосредственно в HTML-разметке для отдельных привязок по мере необходимости, при условии, что вам не нужно делать массовые вычисления на своей странице. Вот пример:
В этом случае вы просто делаете математику в (), а затем используете фильтр | чтобы получить числовой ответ. Вот больше информации о форматировании угловых чисел как текста:
https://docs.angularjs.org/api/ng/filter
источник
Либо привяжите глобальный объект Math к области (не забудьте использовать $ window, а не window)
Используйте привязку в своем HTML:
Или создайте фильтр для конкретной математической функции, которую вы ищете:
Используйте фильтр в вашем HTML:
источник
Это не похоже на очень угловой способ сделать это. Я не совсем уверен, почему это не работает, но вам, вероятно, потребуется доступ к области действия, чтобы использовать такую функцию.
Мое предложение было бы создать фильтр. Это угловой путь.
Затем в вашем HTML сделайте это:
источник
number
Фильтр форматирует число с тысячами разделителей, так что это не строго математическая функция.Более того, его десятичный «ограничитель» не содержит
ceil
дробные десятичные дроби (как некоторые другие ответы заставят вас поверить), а скорее используетround
их.Таким образом, для любой математической функции, которую вы хотите, вы можете внедрить ее (проще имитировать, чем внедрить весь объект Math) следующим образом:
Не нужно также оборачивать его в другую функцию.
источник
Это более или менее краткое изложение трех ответов (Сара Инес Кальдерон, Клаксон и Готбурс), но, поскольку все они добавили что-то важное, я считаю, что стоит объединить решения и добавить еще несколько объяснений.
Рассматривая ваш пример, вы можете выполнять вычисления в своем шаблоне, используя:
Однако это может привести к большому количеству десятичных разрядов, поэтому использование фильтров - хороший способ:
По умолчанию числовой фильтр будет содержать до трех дробных цифр , здесь аргумент fraSize довольно удобно (
{{ 100 * (count/total) | number:fractionSize }}
), что в вашем случае будет:Это также будет округлять результат уже:
Показать фрагмент кода
И последнее, что следует упомянуть, если вы полагаетесь на внешний источник данных, вероятно, хорошей практикой является предоставление правильного запасного значения (в противном случае вы можете увидеть NaN или ничего на вашем сайте):
Sidenote: В зависимости от ваших спецификаций, вы можете даже быть более точными с вашими запасными вариантами / определить запасные варианты уже на более низких уровнях (например
{{(100 * (count || 10)/ (total || 100) | number:2)}}
). Хотя, это не всегда имеет смысл ..источник
Пример Angular Typescript с использованием канала.
math.pipe.ts
Добавить в объявления @NgModule
затем используйте в своем шаблоне так:
источник