基于AngularJS实现iOS8自带的计算器

很高兴能够为您提供“基于AngularJS实现iOS8自带的计算器”的完整攻略。

简介

这个项目的目标是使用 AngularJS 实现一个和iOS8系统中自带计算器类似的计算器应用程序。在本文档中,我们将使用 HTML、CSS 和 JavaScript 来完成此目标,并探讨一些实现上的细节。

实现

开始

首先,在命令行中创建一个名为 angular-calculator 的文件夹,并进入该文件夹:

mkdir angular-calculator
cd angular-calculator

接下来,我们需要创建一个名为 index.html 的 HTML 文件来运行我们的 AngularJS 应用程序。以下是该架构的基本实现:

<!DOCTYPE html>
<html>
  <head>
    <title>iOS8 Calculator Clone</title>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0/css/bootstrap.min.css" />
  </head>

  <body ng-app="CalculatorApp">
    <div ng-controller="CalculatorController">
      <h1>iOS8 Calculator Clone</h1>

      <div class="row">
        <div class="col-md-12">Input: {{ input }}</div>
      </div>

      <div class="row mt-3">
        <button class="btn btn-dark btn-lg col-md-3">AC</button>
        <button class="btn btn-dark btn-lg col-md-3">+/-</button>
        <button class="btn btn-dark btn-lg col-md-3">%</button>
        <button class="btn btn-primary btn-lg col-md-3">÷</button>
      </div>

      <!-- more buttons... -->

    </div>

    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.5/angular.min.js"></script>
    <script src="app.js"></script>
  </body>
</html>

上面的 HTML 文件遵循 Bootstrap 4 的约定,使我们的应用程序看起来像系统自带的 iOS8 计算器。接下来,我们将创建 app.js 文件,并创建一个名为 CalculatorApp 的 AngularJS 应用程序。

AngularJS 应用程序

我们的 AngularJS 应用程序将包括一个名为 CalculatorController 的控制器,并使用 $scope 服务处理控制器之间的通信和状态管理。以下是 app.js 文件的基本实现:

angular.module('CalculatorApp', [])
  .controller('CalculatorController', function($scope) {
    $scope.input = '0';
  });

上面的代码定义了名为 CalculatorApp 的 AngularJS 应用程序,并创建了名为 CalculatorController 的控制器。我们没有在控制器中实现任何逻辑,但是使用了 $scope 服务定义了一个名为 input 的默认状态变量。现在,我们需要将输入添加到文本框中,并将其与应用程序状态绑定。以下是文本框的 HTML 和控制器的更新:

<div class="col-md-12">Input: <input class="form-control" ng-model="input" style="text-align:right;" /></div>
angular.module('CalculatorApp', [])
  .controller('CalculatorController', function($scope) {
    $scope.input = '0';

    $scope.addInput = function(value) {
      $scope.input += value.toString();
    };
  });

现在,我们可以在页面上输入任何数字,并见到进行输入的结果。接下来,我们将添加用于执行运算的代码。

运算

我们的应用程序将支持四个基本运算:加法、减法、乘法和除法。为了实现该功能,我们将在 CalculatorController 中创建两个命令变量:一个用于存储上一个数字,一个用于存储当前正在输入的数字。以下是 CalculatorController 代码的更改:

angular.module('CalculatorApp', [])
  .controller('CalculatorController', function($scope) {
    var pendingValue = null;
    var lastOperation = null;
    var inputString = '0';

    $scope.addInput = function(value) {
      if(inputString === '0') {
        inputString = '';
      }

      inputString += value.toString();
      $scope.input = parseFloat(inputString);
    };
  });

现在,我们可以在输入文本框中添加新数字,但是我们需要一种方法来管理上一次的数字,这就需要知道用户在执行操作之前输入的这个数字。我们需要一个函数来存储这个值,并在用户按下运算符时执行这个函数。

接下来,我们将实现四个完成运算的函数:addsubtractmultiplydivide。我们的应用程序还将支持百分比运算。以下是我们的新控制器与这些运算函数:

angular.module('CalculatorApp', [])
  .controller('CalculatorController', function($scope) {
    var pendingValue = null;
    var lastOperation = null;
    var inputString = '0';

    $scope.addInput = function(value) {
      if(inputString === '0') {
        inputString = '';
      }

      inputString += value.toString();
      $scope.input = parseFloat(inputString);
    };

    $scope.storeValue = function() {
      // Store the current value in a separate variable
      pendingValue = $scope.input;

      // Reset the input string
      inputString = '0';
    };

    $scope.clearAll = function() {
      inputString = '0';
      $scope.input = '0';
      pendingValue = null;
      lastOperation = null;
    };

    $scope.handleOperation = function(operation) {
      // Only execute if we have an operation previously set
      if(lastOperation) {
        switch(lastOperation) {
          case 'add':
            pendingValue += $scope.input;
            break;
          case 'subtract':
            pendingValue -= $scope.input;
            break;
          case 'multiply':
            pendingValue *= $scope.input;
            break;
          case 'divide':
            pendingValue /= $scope.input;
            break;
          case 'percent':
            pendingValue = pendingValue / 100;
            break;
        }

        lastOperation = operation;
        inputString = '0';
        $scope.input = pendingValue;

      } else {
        // If we don't have a lastOperation set, assume that the current input value is our pendingValue
        lastOperation = operation;
        $scope.storeValue();
      }
    };

    $scope.add = function() {
      $scope.handleOperation('add');
    };

    $scope.subtract = function() {
      $scope.handleOperation('subtract');
    };

    $scope.multiply = function() {
      $scope.handleOperation('multiply');
    };

    $scope.divide = function() {
      $scope.handleOperation('divide');
    };

    $scope.percent = function() {
      $scope.handleOperation('percent');
    };
  });

我们可以看到,我们添加了一个名为 pendingValue 的变量,用于存储上次输入的值,以及一个名为lastOperation 的变量,用于在用户执行下一次运算之前记录上一次用户执行的运算类型。这些变量使我们能够执行运算,并将结果存储在 pendingValue 变量中。 接下来,我们将继续完善UI界面。

完善UI

我们的计算器现在可以进行基本的算术运算,但是如果我们希望看起来像 iOS8 自带的计算器,则需要更多的样式。 以下是我们可以更改样式的行的代码:

<div class="row mt-3">
  <button class="btn btn-dark btn-lg col-md-3">AC</button>
  <button class="btn btn-dark btn-lg col-md-3">+/-</button>
  <button class="btn btn-dark btn-lg col-md-3" ng-click="percent()">%</button>
  <button class="btn btn-primary btn-lg col-md-3" ng-click="divide()">÷</button>
</div>

<div class="row mt-3">
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput(7)">7</button>
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput(8)">8</button>
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput(9)">9</button>
  <button class="btn btn-primary btn-lg col-md-3" ng-click="multiply()">*</button>
</div>

<div class="row mt-3">
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput(4)">4</button>
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput(5)">5</button>
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput(6)">6</button>
  <button class="btn btn-primary btn-lg col-md-3" ng-click="subtract()">-</button>
</div>

<div class="row mt-3">
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput(1)">1</button>
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput(2)">2</button>
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput(3)">3</button>
  <button class="btn btn-primary btn-lg col-md-3" ng-click="add()">+</button>
</div>

<div class="row mt-3">
  <button class="btn btn-light btn-lg col-md-6" ng-click="addInput(0)">0</button>
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput('.')">.</button>
  <button class="btn btn-primary btn-lg col-md-3" ng-click="calculate()">=</button>
</div>

以上代码主要是改变了按钮的颜色和添加图标。

特性

现在,您已经知道了一个完全功能的 AngularJS 计算器的构建方法。但是,您可以让它变得更好。以下是您可能希望添加到应用程序的功能:

  • 应用程序可以处理键盘输入。
  • 应用程序可以在计算后保留输入。
  • 应用程序可以添加更多的操作和功能。
  • 应用程序可以添加可配置的选项,例如小数位数或项目的颜色。

示例说明

示例一

我们想要在我们的计算器应用程序中实现小数的运算功能,例如 0.5 * 2 = 11 / 3 = 0.333333 等。为了实现此功能,我们需要在运算函数中添加一些逻辑,以确保当用户输入小数时应用程序的行为正确。以下是修改版的代码实现:

angular.module('CalculatorApp', [])
  .controller('CalculatorController', function($scope) {
    // ...

    $scope.addInput = function(value) {
      if(inputString === '0' && !isNaN(value)) {
        inputString = '';
      }

      inputString += value.toString();
      $scope.input = parseFloat(inputString);
    };

    $scope.handleOperation = function(operation) {
      // Only execute if we have an operation previously set
      if(lastOperation) {
        switch(lastOperation) {
          case 'add':
            pendingValue += $scope.input;
            break;
          case 'subtract':
            pendingValue -= $scope.input;
            break;
          case 'multiply':
            pendingValue *= $scope.input;
            break;
          case 'divide':
            pendingValue /= $scope.input;
            break;
          case 'percent':
            pendingValue = pendingValue / 100;
            break;
        }

        lastOperation = operation;
        inputString = '0';
        $scope.input = parseFloat(pendingValue.toFixed(10));

      } else {
        // If we don't have a lastOperation set, assume that the current input value is our pendingValue
        lastOperation = operation;
        $scope.storeValue();
      }
    };
  });

我们将 addInput 函数的实现更改为更好地处理小数。 此外,我们在 handleOperation 函数中添加代码来限制计算结果小数位数的方法。

示例二

我们要在我们的计算器上添加一个求平方根的功能。我们可以先在计算器上带上SQRT操作按钮,然后在下面添加SQRT函数实现。如果用户输入负数,则在求平方根按钮上启用‘AC’按钮并显示一个错误。以下是修改版的代码实现:

<div class="row mt-3">
  <button class="btn btn-dark btn-lg col-md-3" ng-click="clearAll()" ng-class="{ 'disabled': input < 0 }">AC</button>
  <button class="btn btn-dark btn-lg col-md-3" ng-click="addInput('-')" ng-class="{ 'disabled': input < 0 }">+/-</button>
  <button class="btn btn-dark btn-lg col-md-3" ng-click="percent()" ng-class="{ 'disabled': input < 0 }">%</button>
  <button class="btn btn-primary btn-lg col-md-3" ng-click="divide()" ng-class="{ 'disabled': input < 0 }">÷</button>
</div>

<div class="row mt-3">
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput(7)">7</button>
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput(8)">8</button>
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput(9)">9</button>
  <button class="btn btn-primary btn-lg col-md-3" ng-click="multiply()">*</button>
</div>

<div class="row mt-3">
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput(4)">4</button>
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput(5)">5</button>
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput(6)">6</button>
  <button class="btn btn-primary btn-lg col-md-3" ng-click="subtract()">-</button>
</div>

<div class="row mt-3">
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput(1)">1</button>
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput(2)">2</button>
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput(3)">3</button>
  <button class="btn btn-primary btn-lg col-md-3" ng-click="add()">+</button>
</div>

<div class="row mt-3">
  <button class="btn btn-light btn-lg col-md-6" ng-click="addInput(0)">0</button>
  <button class="btn btn-light btn-lg col-md-3" ng-click="addInput('.')">.</button>
  <button class="btn btn-primary btn-lg col-md-3" ng-click="calculate()">=</button>
</div>

<div class="row mt-3">
  <button class="btn btn-info btn-lg col-md-6" ng-click="sqrt()" ng-class="{ 'disabled': input < 0 }">√</button>
  <button class="btn btn-danger btn-lg col-md-6" ng-click="clear()" ng-class="{ 'disabled': input < 0 }">C</button>
</div>
angular.module('CalculatorApp', [])
  .controller('CalculatorController', function($scope) {
    // ...

    $scope.sqrt = function() {
      if($scope.input >= 0) {
        $scope.input = Math.sqrt($scope.input).toFixed(10);
      } else {
        $scope.input = 'Error';
      }
    };

    $scope.clear = function() {
      if($scope.input >= 0) {
        $scope.input = $scope.input.toString().substring(0, $scope.input.length - 1);
      }
    };
  });

上面的代码添加了一个名为 sqrt 的函数,以计算输入数字的平方根,并引入了名为 clear 的函数,以删除当前输入。括号内的 ng-class 指令用于根据输入状态禁用按钮,以防止用户执行无效操作。

好了,以上就是详细讲解“基于AngularJS实现iOS

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于AngularJS实现iOS8自带的计算器 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JSONObject与JSONArray使用方法解析

    JSONObject与JSONArray使用方法解析 在Java开发中,我们经常需要操作JSON格式数据,而Java提供了两个类来操作JSON数据,分别是JSONObject和JSONArray。 JSONObject JSONObject是JSON的对象表示法,在Java中,我们可以使用JSONObject来构建一个JSON对象。 创建JSONObject…

    JavaScript 2023年6月11日
    00
  • javascript 基础简介 适合新手学习

    JavaScript 基础简介 适合新手学习 JavaScript 是一种广泛应用于编写网页脚本的编程语言。学习 JavaScript 对于新手来说是一项基础工作,本文章为新手介绍 JavaScript 的基础语法、数据类型、流程控制以及实例应用。 JavaScript 基础语法 JavaScript 代码可嵌入 HTML 页面的 \ 标签中。有两种方式,一…

    JavaScript 2023年5月18日
    00
  • JavaScript的模块化:封装(闭包),继承(原型) 介绍

    JavaScript的模块化是一种将代码按照一定方式进行组织的方法。在JavaScript中,我们可以使用封装和继承实现模块化。 封装 封装是一种通过闭包实现的模块化方式,可以将一些数据和函数放在一个私有的作用域中,从而避免污染全局变量,同时将一些方法暴露出来,使之成为共有的API。 示例1 下面是一个简单的封装示例,通过IIFE(立即调用的函数表达式)创建…

    JavaScript 2023年6月10日
    00
  • 浅析JavaScript作用域链、执行上下文与闭包

    让我来为你详细讲解一下“浅析JavaScript作用域链、执行上下文与闭包”的完整攻略。 一、作用域链 作用域是指程序中的变量能够被访问的范围。JavaScript采用的是词法作用域,也就是在定义变量时就确定了变量的作用域。作用域链就是由当前执行环境与其上层环境的变量对象组成的链表。在查找变量时,会沿着这个链表一级一级地向上查找,直到找到为止。如果最终还没有…

    JavaScript 2023年6月10日
    00
  • 12种实现301网页重定向方法的代码实例(含Web编程语言和Web服务器)

    标题:12种实现301网页重定向方法的代码实例 什么是301网页重定向? 301网页重定向是一种将一个URL重定向到另一个URL的技术,被广泛用于网站重构、域名更改等场景中。重定向的状态码为301,它告诉搜索引擎,原始的URL已经永久性地移到了新的URL,此时搜索引擎会把原始的SEO权重传递给新的URL。 实现301网页重定向的12种方法 1. 使用HTTP…

    JavaScript 2023年6月11日
    00
  • 为JS扩展Array.prototype.indexOf引发的问题及解决办法

    如果扩展 Array.prototype.indexOf 方法,可能会在不经意间影响到其他代码或第三方库的运行,导致一些难以发现或修复的奇怪问题。在扩展 Array.prototype.indexOf 方法时,应该考虑仔细分析其潜在影响,并采取一些防范措施以避免可能出现的冲突和问题。 为JS扩展Array.prototype.indexOf引发的问题 当我们…

    JavaScript 2023年6月11日
    00
  • Javascript数组及类数组相关原理详解

    Javascript数组及类数组相关原理详解 在Javascript中数组是一个非常重要的数据结构,它可以存储多个数据并进行操作。但是在实际开发中,我们还会遇到类数组对象,这些对象类似于数组但并不是数组,本文将详细介绍Javascript数组及类数组相关原理。 数组基本操作 定义数组 定义数组有两种方式,一种是通过字面量方式,另一种是通过构造函数方式。 //…

    JavaScript 2023年5月27日
    00
  • 不使用script导入js文件的几种方法

    当我们需要在网页中引入JS文件时,一般会使用<script>标签来实现,但有时我们也需要不使用<script>标签来实现,以下是几种不使用<script>标签导入JS文件的方法: 1. 使用Link标签: 我们可以使用<link>标签的href属性来链接JS文件,这种方式一般用于引入CSS文件,但是也可以用于J…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部