После написания самого простого примера, я захотел создать небольшой калькулятор с помощью Angular. Это один из наиболее простых примеров кода, которые я могу представить после "Hello World" и "Echo".
Так что я решил создать страницу с помощью AngularJS, которая сложит два числа.
Наивный подход
Наивным решением, которое не сработало, было создать два элемента input
с ng-model
'a' и 'b',
и затем написать выражение, складывающее эти два значения.
<script src="angular.min.js"></script>
<div ng-app>
<input ng-model="a">
<input ng-model="b">
<h1>{{ a + b }}</h1>
</div>
К сожалению, JavaScript, а следовательно и Angular, обрабатывают введенные значения как строки,
даже если это на самом деле числа. Поэтому использование оператора +
для строк приводит к их конкатенации.
Следовательно, если мы попробуем пример выше и введем в поля 2 и 3, то получим в результате 23.
Сложение чисел с помощью контролллера
Сначала, как мы делали в примере Hello World,
мы создали модуль и контроллер.
Внутри контроллера мы создали функцию AddNumbers
, связанную со $scope
.
В той функции мы получаем значения для двух элементов input
и преобразовываем их
в Number
с помощью вызова функции JavaScript. (Чтобы избежать использования значения undefined
,
мы присваиваем значение по умолчанию равное 0.)
Затем мы суммируем значения и присваиваем полученное к созданному атрибуту sum
.
examples/angular/add_numbers_controller.js
angular.module('AddNumbersApp', [])
.controller('AddNumbersController', function($scope) {
$scope.AddNumbers = function() {
var a = Number($scope.a || 0);
var b = Number($scope.b || 0);
$scope.sum = a+b;
}
});
Затем в HTML мы можем использовать этот атрибут sum
как часть простого выражения.
Для вызова функции AddNumbers
, мы также добавили атрибут ng-keyup
к обоим элементам input
:
examples/angular/add_numbers_controller.html
<script src="angular.min.js"></script>
<script src="add_numbers_controller.js"></script>
<div ng-app="AddNumbersApp">
<div ng-controller="AddNumbersController">
<input ng-model="a" ng-keyup="AddNumbers()">
<input ng-model="b" ng-keyup="AddNumbers()">
<h1>{{ sum }}</h1>
</div>
</div>
Попробуйте! Это великолепно работает!
Пока я это писал, подумал, что должно быть более простое решение, так как такой способ выглядит слишком сложным. И в самом деле, более простое решение существует.
Сложение чисел
Как оказалось, достаточно просто указать Angular, чтобы он оперировал со значениями, как с числами.
Мы просто добавляем type="number"
к каждому элементу input
:
examples/angular/add_numbers.html
<script src="angular.min.js"></script>
<div ng-app>
<input ng-model="a" type="number">
<input ng-model="b" type="number">
<h1>{{ a + b }}</h1>
</div>