angularJS1笔记-(3)-购物车增删改查练习

2023-11-09

 

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="../../vendor/bootstrap3/css/bootstrap.min.css">
</head>
<body ng-app="myApp">
<div class="container">
    <table class="table" ng-controller="firstController" ng-show="cart.length">
        <thead>
        <tr>
            <th>产品编号</th>
            <th>产品名字</th>
            <th>购买数量</th>
            <th>产品单价</th>
            <th>产品总价</th>
            <th>操作</th>
        </tr>
        </thead>
        <tbody>
        <tr ng-repeat="item in cart">
            <td>{{item.id}}</td>
            <td>{{item.name}}</td>
            <td>
                <button type="button" ng-click="reduce(item.id)" class="btn btn-primary">-</button>
                <input type="text" value="item.quantity" ng-model="item.quantity"/>
                <button type="button" ng-click="add(item.id)" class="btn btn-primary">+</button>
            </td>
            <td>{{item.price}}</td>
            <td>{{item.price*item.quantity}}</td>
            <td>
                <button type="button" class="btn btn-primary" ng-click="remove(item.id)">移除</button>
            </td>
        </tr>
        <tr>
            <td>
                总价:
            </td>
            <td>
                {{totalPrice()}}
            </td>
            <td>
                总购买数量:
            </td>
            <td>
                {{totalCount()}}
            </td>
            <td colspan="2">
                <button type="button" class="btn btn-primary" ng-click="cart = {}">清空购物车</button>
            </td>
        </tr>
        </tbody>
    </table>
    <p ng-show="!cart.length">您的购物车为空</p>
</div>
<script type="text/javascript" src="../../vendor/angular/angularJs.js"></script>
<script type="text/javascript" src="app/index.js"></script>
</body>
</html>

js:

angular.module('myApp', []).controller('firstController', function ($scope) {
    $scope.cart = [
        {
            id: 1000,
            name: 'iphone7p',
            quantity: 2,
            price: 4999
        },
        {
            id: 1001,
            name: 'iphone4p',
            quantity: 2,
            price: 999
        },
        {
            id: 1002,
            name: 'iphone6p',
            quantity: 6,
            price: 3999
        },
        {
            id: 1003,
            name: 'iphoneSE',
            quantity: 20,
            price: 11999
        }
    ];

    //计算总价
    $scope.totalPrice = function () {
        var totalPrice = 0;
        angular.forEach($scope.cart, function (item) {
            totalPrice += parseInt(item.quantity) * item.price;
        })
        return totalPrice;
    }
    //计算总购买数量
    $scope.totalCount = function () {
        var totalCount = 0;
        angular.forEach($scope.cart, function (item) {
            totalCount += parseInt(item.quantity);
        })
        return totalCount;
    }
    //移除
    $scope.remove = function (id) {
        var index = -1;
        angular.forEach($scope.cart, function (item, key) {
            if (item.id == id) {
                index = key;
            }
        })
        if (index != -1) {
            $scope.cart.splice(index, 1);
        }
    }

    //找索引 因为angular的机制是通过索引来删除
    var findIndex = function (id) {
        var index = -1;
        angular.forEach($scope.cart, function (item, key) {
            if (item.id == id) {
                index = key;
                return;
            }
        });
        return index;
    }

    //添加
    $scope.add = function (id) {
        var index = findIndex(id);
        if (index != -1) {

            ++$scope.cart[index].quantity;
        }
    }
    //删除
    $scope.reduce = function (id) {

        var index = findIndex(id);

        if (index != -1) {
            var item = $scope.cart[index];
            if(item.quantity>1){
                --item.quantity;
            }else {
                var returnKey = confirm('从购物车中删除该商品吗?')
                if (returnKey) {
                    $scope.cart.splice(index, 1);
                }
            }
        }
    }

    $scope.$watch('cart',function (newValue,oldValue) {
        angular.forEach(newValue,function (item, key) {
            if(item.quantity<1){
                var returnKey = confirm('是否从购物车内删除该产品?');
                if(returnKey){
                    $scope.cart.splice(key, 1);
                }else{
                    item.quantity = oldValue[key].quantity;
                }
            }
        })
    },true);
});

 最终结果:

因为angular是MVVM模式的双向绑定数据,所以当你改变其中变量的时候其他地方凡是用到了此变量地方都会跟着变。

 

转载于:https://www.cnblogs.com/yk123/p/6782088.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

angularJS1笔记-(3)-购物车增删改查练习 的相关文章

  • Jquery获取选中的复选框

    您好 我想获取页面中选定复选框的列表 实际上我真正需要的是获取复选框旁边的元素的文本 该元素是一个 html 元素 li 代码如下 但它不起作用 这是我当前的 jQuery document ready function target cl
  • 如何阻止直接访问我的 JavaScript 文件?

    我使用 Minify 来缩小并缓存所有脚本请求 我只希望我的用户能够访问 JavaScript 文件的缩小版本 缩小位于www example com min我的脚本位于www example com scripts 如何阻止直接访问doc
  • Firebase,只得到新的孩子[重复]

    这个问题在这里已经有答案了 var firebase new Firebase firebaseRef on child added function snapshot 这将接收所有元素 有没有办法在创建新的 Firebase 引用时不接收
  • 在 Internet Explorer 中使用什么来监视 jscript 内存使用情况

    我们正在调试 GWT 应用程序 在 Firefox 中运行正常 在 IE6 0 中开始运行正常 但一段时间后 它就会崩溃并开始爬行 经过一些测试后 我们怀疑存在一些内存问题 使用了太多内存 内存泄漏等 除了使用taskmanager和pro
  • 从函数返回函数的目的是什么?

    阅读一些遗留代码 发现 A prototype setSize function var v1 new Vector2 return function size var halfSize v1 copy size multiplyScala
  • 使用 Node.js 构建网站的最佳实践

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我想知道如何使用 Node js 从头开始 开发一个网站 我明白我怎么能possibly
  • 如何在网站上使用 svg 元素制作块的屏幕截图?

    我在网站上创建了一个构造函数 其本质是将所选元素及其颜色 svg中的元素 添加到访问者选择的背景和背景颜色 png中的背景 中 然后必须单击 保存 结果 按钮并仅执行工作区的屏幕截图 我写了这个脚本 但它需要屏幕截图 但只有背景 并忽略选定
  • 为什么 setTimeout 在 Chrome 中触发两次,而在 IE 或 Firefox 中则不然?

    有人能告诉我为什么 javascript 函数 生成新号码 在 Chrome 中触发两次 但在 IE 或 Firefox 中则不会 使用 Chrome 20 0 1132 57 IE9 和 Firefox 13
  • ReactTransitionGroup 不适用于 React-redux 连接组件

    我正在开发一个更大的项目 但我创建了这个简短的示例来说明问题 如果我使用Box组件 它的工作原理 它在控制台中输出componentWillEnter and componentWillLeave当我们点击按钮时 如果我使用BoxConta
  • React autoFocus 将光标设置为输入值的开头

    我有一个受控输入 最初显示一个值 我已将该输入设置为自动聚焦 但当我希望它出现在末尾时 光标出现在输入的开头 我知道这可能是因为自动对焦是在值之前添加的 但我不能 100 确定 在输入字段末尾完成光标初始化的最佳方法是什么 var Test
  • JavaScript 中的 Promise 有什么意义?

    一个承诺是一个 可能现在可用 或将来可用 或永远不可用的值 来源 MDN 假设我有一个想要处理图片的应用程序 图片已加载 例如在算法在后台使用它之后 或某种其他类型的延迟 现在我想检查一下图片是否可以在future 通过使用承诺 而不是回调
  • 如何使用角度材料在具有可扩展行的表格中创建嵌套垫表

    我有以下数据 id c9d5ab1a subdomain wing domain aircraft part id c9d5ab1a info mimetype application json info dependent parent
  • IE 中的 XPath 查询使用从零开始的索引,但 W3C 规范是从一开始的。我应该如何处理差异?

    问题 我正在转换目前仅适用于 Internet Explorer 的相对较大的 Javascript 代码 以便使其也适用于其他浏览器 由于代码广泛使用 XPath 我们做了一些兼容性功能以使事情变得更容易 function selectN
  • 使用 Google 日历源时如何禁用 FullCalendar 中的活动链接?

    我正在使用 FullCalendar 库从 Google 日历加载日历中的事件 不幸的是 事件添加到日历后 它们是可点击的 当您点击该活动时 您会自动重定向到 Google 日历页面以查看该特定活动 或者如果您有足够的访问权限 则可以直接对
  • 聆听 Angular 2 中的元素可见性

    我正在为我的网络应用程序使用 Bootstrap 和 Angular 2 v4 我想监听指令中的元素以了解可见性变化 我的元素有一个可以隐藏其子元素的父元素hidden sm up我需要在每次隐藏或显示时触发一个函数 div hidden
  • 如何从浏览器向服务器发送“页面将关闭”消息?

    我想向每个 html 文档添加一个脚本 JavaScript 该脚本向服务器发送两条消息 页面确实打开了 页面将关闭 此消息包含页面打开的时间 打开消息应在文档加载时 或加载完成时 发送 这是简单的部分 The close message
  • 主页(网格)上的缩略图现在显得模糊。如何纠正?

    我不知道这看起来是否愚蠢 但从早上开始我就无法纠正这个突然出现在我的博客网站上的错误www candidopinions in http www candidopinions in 我有一个网格视图模板 其中博客文章中的特色图像作为调整大小
  • 什么是 WKWebView 中的 WKErrorDomain 错误 4

    fatal error LPWebView encounters an error Error Domain WKErrorDomain Code 4 A JavaScript exception occurred UserInfo 0x7
  • 测量窗口偏移

    有没有一种方法可以测量 jQuery 中窗口的偏移量 以便我可以比较 固定 元素和相对定位元素的位置 我需要能够知道窗口滚动了多远 以便我可以使用该图来计算固定元素的高度 相对于视口顶部 和相对对象的高度 相对于顶部 之间的差异文件的内容
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对

随机推荐