【问题标题】:add an item to cart将商品添加到购物车
【发布时间】:2016-12-19 02:46:17
【问题描述】:

我正在制作一个小应用程序,它可以从列表中搜索一个项目,显示它的价格并将其乘以数量。在其下方,我添加了一个添加按钮。现在我希望在按钮下添加带有价格和数量的商品(基本上可以制作类似购物车的东西),但我正在努力处理代码,它不起作用。

代码如下:

<!DOCTYPE html>
 <html lang="en" ng-app="myApp" ng-cloak>
  <head>
    <meta charset="utf-8">
    <title>app</title>
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular-animate.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular-aria.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular-messages.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angular_material/1.1.0-rc.5/angular-material.min.js"></script>
    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
    <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/angular_material/1.1.0-rc.5/angular-material.min.css">    
    <link rel="stylesheet" href="./style.css" type="text/css">
    <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic, 700italic' rel='stylesheet' type='text/css'>
  </head>
  <body  layout="column" ng-controller="autoCompleteController">
      <div>
     <h1>Purchase Order</h1>
      <div>
        <div layout="row">
          <div flex><h4>Name</h4></div>
          <div flex><h4>Quantity</h4></div>
          <div flex><h4>Price</h4></div>
          <div flex><h4>Total</h4></div>
        </div>
        <div layout="row">
          <div flex>
           <md-autocomplete flex 
              md-selected-item="selectedItem" 
              md-search-text="searchText" 
              md-items="item in querySearch(searchText)"
              md-item-text="item.name" 
              placeholder="Product name"
              md-min-length="0">
          <span md-highlight-text="searchText">{{item.name}}</span>
      </md-autocomplete>
          </div>
          <div flex>
          <md-input-container md-no-float class="md-block">
          <input ng-model="quantity" placeholder="Quantity">
        </md-input-container>
          </div>
          <div flex><p>{{selectedItem.price}}</p></div>
          <div flex><p>{{quantity * selectedItem.price}}</p></div>
        </div>
        <div>
                       <p>{{jsonCartItem.name}}</p>
                       <p>{{jsonCartItem.price}}</p>
                       <p>{{jsonCartItem.qty}}</p>
                       <p>{{jsonCartItem.totAmt}}</p>
        </div>
        <md-button class="md-raised" ng-click="AddInCart()">Add item</md-button>
      </div>
</div>
   <script src="../src/api.js"></script>
  </body>
</html>

和 JS:

var myApp = angular.module('myApp', ['ngMaterial']);
    myApp.controller('autoCompleteController', function($scope) {     
        $scope.querySearch = function() {
            return $scope.products.filter(p => p.name.toLowerCase().includes($scope.searchText));
        };
        $scope.AddInCart = function() {
            var itemName = $scope.products.name;
            var itemPrice = parseInt($scope.products.price);
            var itemQty = parseInt($scope.quantity);
            var totalPrice = parseInt(itemPrice * itemQty);
            var jsonCartItem = {
                'name' : itemName,
                'price' : itemPrice,
                'qty' : itemQty,
                'totAmt' : totalPrice
            };
            $scope.products.push(jsonCartItem);
        };

        $scope.products = [
            {name:"Worn Shortsword",price:3}
            /*4000 other products here */
           ,{name:"Annealed Blade",price:12980}
        ];
    });

如果有人能指出我做错了什么,我将不胜感激。

这是代码笔:http://codepen.io/summerfreeze/pen/VjqJYW

【问题讨论】:

  • 该代码没有意义。 $scope.products 是一个数组,它没有 .name.price 等。您可能想要selectedItem
  • 你想把它$scope.products的商品添加到购物车吗?
  • 我会做一个代码笔,这样你就会看到我到底想要做什么
  • 我在我的问题中添加了一个codepen
  • 您的代码运行良好。你到底想做什么?您正在将商品添加到购物车,但没有显示您正在寻找的商品?

标签: javascript angularjs


【解决方案1】:

var myApp = angular.module('myApp', ['ngMaterial']);
    myApp.controller('autoCompleteController', function($scope) {      
      $scope.selectedItems = [];
        $scope.querySearch = function() {
            return $scope.products.filter(p => p.name.toLowerCase().includes($scope.searchText));
        };
        $scope.AddInCart = function() {
            var itemName = $scope.selectedItem.name;
            var itemPrice = parseInt($scope.selectedItem.price);
            var itemQty = parseInt($scope.quantity);
            var totalPrice = parseInt(itemPrice * itemQty);
            var jsonCartItem = {
                'name' : itemName,
                'price' : itemPrice,
                'qty' : itemQty,
                'totAmt' : totalPrice
            };
            $scope.selectedItems.push(jsonCartItem);
          console.log($scope.selectedItems);
        };

        $scope.products = [
    {name:"Worn Shortsword",price:3}
    ,{name:"Bent Staff",price:4}
   ,{name:"Worn Mace",price:3}
   ,{name:"Worn Axe",price:3}
             ,{name:"Revelosh's Armguards",price:4500}
   ,{name:"Revelosh's Spaulders",price:6725}
   ,{name:"Revelosh's Gloves",price:4534}
   ,{name:"The Shoveler",price:16164}
   ,{name:"Annealed Blade",price:12980}
];
    });
body {
    max-width: 720px;
    background: #eee;
    margin: 2em auto;
    font-family: 'Open Sans', sans-serfi;
}

div.row > * {
    width: 24%;
    display: inline-block;
}

div.row {
    position: relative;
}


div.row > *:nth-child(n + 3) {
    text-align: right;
}

button {
    margin-top: 1em;
}

input {
    padding: 0.4em;
}

md-autocomplete {
    width: 80%;
}
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular-animate.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular-aria.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular-messages.min.js"></script>
 <script src="http://ajax.googleapis.com/ajax/libs/angular_material/1.1.0-rc2/angular-material.min.js"></script>

<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/angular_material/1.1.0-rc2/angular-material.min.css">
  
 <html lang="en">
   <body  ng-app="myApp" ng-cloak ng-controller="autoCompleteController" layout="column" >
      <div>
     <h1>Purchase Order</h1>
      <div>
        <div layout="row">
          <div flex><h4>Name</h4></div>
          <div flex><h4>Quantity</h4></div>
          <div flex><h4>Price</h4></div>
          <div flex><h4>Total</h4></div>
        </div>
        <div layout="row">
          <div flex>
           <md-autocomplete flex 
              md-selected-item="selectedItem" 
              md-search-text="searchText" 
              md-items="item in querySearch(searchText)"
              md-item-text="item.name" 
              placeholder="Product name"
              md-min-length="0">
          <span md-highlight-text="searchText">{{item.name}}</span>
      </md-autocomplete>
          </div>
          <div flex>
          <md-input-container md-no-float class="md-block">
          <input ng-model="quantity" placeholder="Quantity">
        </md-input-container>
          </div>
          <div flex><p>{{selectedItem.price}}</p></div>
          <div flex><p>{{quantity * selectedItem.price}}</p></div>
        </div>
        <div>
                       <p>{{jsonCartItem.name}}</p>
                       <p>{{jsonCartItem.price}}</p>
                       <p>{{jsonCartItem.qty}}</p>
                       <p>{{jsonCartItem.totAmt}}</p>
        </div>
        <md-button class="md-raised" ng-click="AddInCart()">Add item</md-button>
      </div>
      <h4>Added Items</h4>
      <table>
        <tr ng-repeat="item in selectedItems">
          <td>{{item.name}}</td>
          <td>{{item.qty}}</td>
          <td>{{item.totAmt}}</td>
        </tr>
      </table>
</div>
   <script src="../src/api.js"></script>
  </body> 

正如@Dinesh Shah 所解释的,您只能使用索引来访问数组元素。

我看到的另一个错误是,当单击“添加到购物车”按钮时,您试图将“jsonCartItem”推送到主集合“$scope.products”中,这是错误的。

“$scope.products”是项目的主集合。

您应该再初始化一个范围变量,如下所示

$scope.addedItems = [];

然后可能

$scope.addedItems.push(jsonCartItem);

【讨论】:

  • 我添加了一个代码笔,以便您可以更好地可视化我正在尝试做的事情
  • 太棒了!这正是我想做的。
【解决方案2】:

var myApp = angular.module('myApp', ['ngMaterial']);
    myApp.controller('autoCompleteController', function($scope) {      
      $scope.selectedItems = [];
        $scope.querySearch = function() {
            return $scope.products.filter(p => p.name.toLowerCase().includes($scope.searchText));
        };
        $scope.AddInCart = function() {
            var itemName = $scope.selectedItem.name;
            var itemPrice = parseInt($scope.selectedItem.price);
            var itemQty = parseInt($scope.quantity);
            var totalPrice = parseInt(itemPrice * itemQty);
            var jsonCartItem = {
                'name' : itemName,
                'price' : itemPrice,
                'qty' : itemQty,
                'totAmt' : totalPrice
            };
            $scope.selectedItems.push(jsonCartItem);
          console.log($scope.selectedItems);
        };

        $scope.products = [
    {name:"Worn Shortsword",price:3}
    ,{name:"Bent Staff",price:4}
   ,{name:"Worn Mace",price:3}
   ,{name:"Worn Axe",price:3}
             ,{name:"Revelosh's Armguards",price:4500}
   ,{name:"Revelosh's Spaulders",price:6725}
   ,{name:"Revelosh's Gloves",price:4534}
   ,{name:"The Shoveler",price:16164}
   ,{name:"Annealed Blade",price:12980}
];
    });
body {
    max-width: 720px;
    background: #eee;
    margin: 2em auto;
    font-family: 'Open Sans', sans-serfi;
}

div.row > * {
    width: 24%;
    display: inline-block;
}

div.row {
    position: relative;
}


div.row > *:nth-child(n + 3) {
    text-align: right;
}

button {
    margin-top: 1em;
}

input {
    padding: 0.4em;
}

md-autocomplete {
    width: 80%;
}
  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular-animate.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular-aria.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular-messages.min.js"></script>
 <script src="http://ajax.googleapis.com/ajax/libs/angular_material/1.1.0-rc2/angular-material.min.js"></script>

<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/angular_material/1.1.0-rc2/angular-material.min.css">
  
 <html lang="en">
   <body  ng-app="myApp" ng-cloak ng-controller="autoCompleteController" layout="column" >
      <div>
     <h1>Purchase Order</h1>
      <div>
        <div layout="row">
          <div flex><h4>Name</h4></div>
          <div flex><h4>Quantity</h4></div>
          <div flex><h4>Price</h4></div>
          <div flex><h4>Total</h4></div>
        </div>
        <div layout="row">
          <div flex>
           <md-autocomplete flex 
              md-selected-item="selectedItem" 
              md-search-text="searchText" 
              md-items="item in querySearch(searchText)"
              md-item-text="item.name" 
              placeholder="Product name"
              md-min-length="0">
          <span md-highlight-text="searchText">{{item.name}}</span>
      </md-autocomplete>
          </div>
          <div flex>
          <md-input-container md-no-float class="md-block">
          <input ng-model="quantity" placeholder="Quantity">
        </md-input-container>
          </div>
          <div flex><p>{{selectedItem.price}}</p></div>
          <div flex><p>{{quantity * selectedItem.price}}</p></div>
        </div>
        <div>
                       <p>{{jsonCartItem.name}}</p>
                       <p>{{jsonCartItem.price}}</p>
                       <p>{{jsonCartItem.qty}}</p>
                       <p>{{jsonCartItem.totAmt}}</p>
        </div>
        <md-button class="md-raised" ng-click="AddInCart()">Add item</md-button>
      </div>
</div>
   <script src="../src/api.js"></script>
  </body>
 

你在代码中犯了一些错误

像 $scope.products 是数组,没有索引就不能访问它 您应该指定要添加的产品

例如这里我使用 0 索引,所以每次它都会从 products 数组中获取第一个产品。

var itemName = $scope.products[0].name;
var itemPrice = parseInt($scope.products[0].price);
var itemQty = parseInt($scope[0].quantity);
var totalPrice = parseInt(itemPrice * itemQty);

在您的代码中更改这些行,并在 products 数组中指定选定的产品。

【讨论】:

  • 它也不起作用。我添加了一个 codepen,以便您可以更好地可视化我正在尝试做的事情。
  • 你在 codepen 中犯了一些错误,把这行 $scope.selectedItem.push(jsonCartItem) 改成 $scope.selectedItems.push(jsonCartItem); nd 声明变量 $scope.selectedItems = [];内部控制器
  • 我做了,但还是没有
  • 这里是工作代码笔codepen.io/anon/pen/kXzKwr?editors=1111,在控制台检查我已经在控制台打印了选定的项目。
  • 是的,您在控制台中遇到什么类型的错误?
猜你喜欢
  • 2020-01-14
  • 2015-03-31
  • 2018-04-10
  • 1970-01-01
  • 2017-02-07
  • 2021-12-20
  • 1970-01-01
相关资源
最近更新 更多