无法在Angular 2中的扫描中添加数组中的项目

时间:2018-04-18 11:17:36

标签: javascript angular

我正在使用 Angular 2 开发应用程序..在我的应用程序中,我使用条形码扫描程序扫描文本字段并将这些项目存储在数组中。 / p>

当我扫描项目时,会添加到数组中,但是当我扫描另一个项目时,旧项目会替换数组中的旧值。

以下是我正在使用的代码段。如果您看到任何针对这个奇怪问题的修复,请帮助我。

    import { Component,ViewChild,Input, Output,OnInit,ChangeDetectorRef   } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HeaderComponent } from '../common/header.component';
//import { SaleCart } from '../model/SaleCart';
//import * as $ from "jquery";
declare var jQuery: any
@Component({
  selector: 'app-test',
  templateUrl: './test.component.html',
  styleUrls: ['./posapp.component.css']


})
export class TestComponent implements OnInit{
  title = 'Treewalker POS';


  public cartItems = []; 
  public query;
  public filteredList = [];
  public products = [{"id":"3","name":"Pears Soap Original 75gm","sku":"89675432189","price":"32.00","special_price":"32.00","qty":null,"barcode":"89675432189","tax":"5","discount":"0"},{"id":"1","name":"Rin","sku":"1111111111111","price":"11.00","special_price":"11.00","qty":"10.000","barcode":"1111111111111","tax":"5","discount":"0"},{"id":"2","name":"Test 1","sku":"23456","price":"10.00","special_price":"10.00","qty":"10.000","barcode":"23456","tax":"5","discount":"0"}];
  constructor() { 



  }

    ngOnInit() {


  }

  add(item) {

    /* check the items in the json data */
    let flag = false;
    var foodItem = {};
    for (let product of this.products) {
       if(product.barcode == item) {
          flag = true; 
          foodItem['ctr'] = 1;
          foodItem['item'] = product;
          break;
        }
    }

    let localCart = [];
    if(sessionStorage.getItem("cart")){
      localCart =  JSON.parse(sessionStorage.getItem("cart"));
      //console.log(JSON.stringify(localCart));
    }
    //console.log("food "+JSON.stringify(this.cart));  
    if(flag && localCart.length) {

      let exist = 0;

      for(let i=0; i < localCart.length; i++) {

        if(localCart[i].item.barcode == item) {

          localCart[i].ctr = parseInt(localCart[i].ctr) + 1; 
          //console.log("@@@@ "+this.cart[i].ctr+" --- "+item);
          exist = 1;

        }
      }
      if(!exist){
        localCart.push(foodItem);
      }
      sessionStorage.setItem("cart",JSON.stringify(localCart));

      //this.barcode = "";
    }else if(flag){

      localCart.push(foodItem);

      sessionStorage.setItem("cart",JSON.stringify(localCart));
    }
    //this.cart = JSON.parse(sessionStorage.getItem("cart"));

    //this.itemsCnt = localCart.length;
    //console.log("--- "+this.itemsCnt);
    console.log(JSON.parse(sessionStorage.getItem('cart')));
    //this.onScanProduct.emit(localCart);


}

  filter(e) {
    //e.preventDefault();  
    if (this.query !== ""){

        this.filteredList = this.products.filter(function(el){
            if(el.barcode.toLowerCase() == this.query.toLowerCase()) {

                return el.barcode.toLowerCase() == this.query.toLowerCase();
            }else{
               return el.barcode.toLowerCase().indexOf(this.query.toLowerCase()) > -1;
            } 

        }.bind(this));

        /* scanned item will be added to the cart */         
        console.log(this.filteredList.length);
        if(this.filteredList.length > 0 && e.which == 13){

            //console.log(JSON.stringify(this.filteredList));
            for (let product of this.filteredList) {
                //console.log(filter.barcode+"=="+this.query);
                if(product.barcode == this.query) {
                    this.add(product.barcode);
                    jQuery('#barcode').val("");jQuery('#barcode').focus();
                    this.filteredList = [];
                }
            }

        } 

    }else{
        this.filteredList = [];
    }
}



}

以下是html模板

<div class="content-wrapper">
    <section class="content">

       <form>
         <div class="row">
          <!-- sales item add window -->

          <!-- end --> 

            <div class="col-sm-4">





               <div class="box box-primary">
                   <div class="box-body">

                    <div class="form-group">
                        <div class="row">
                           <div class="col-md-9">
                              <!--<input type="text" class="form-control" id="barcode"  name="barcode" [(ngModel)]="barcode" (ngModelChange)="add($event)"
                              placeholder="Enter item code or scan the barcode" autocomplete="off" />-->
                              <input id="barcode" type="text" class="form-control validate filter-input" name="query" [(ngModel)]="query" (keyup)="filter($event)" placeholder="Enter item code or scan the barcode" autocomplete="off" [ngModelOptions]="{standalone: true}">
                           </div>
                           <div class="suggestions" *ngIf="filteredList.length > 0">
                              <ul>
                                  <li *ngFor="let item of filteredList" >
                                      <a (click)="select(item)" href="javascript:;">{{item.barcode}} {{item.name}}</a>
                                  </li>
                              </ul>
                          </div>
                           <div class="col-md-3">
                              <button type="button" class="btn btn-primary" (click)="createnewproduct(newproduct)">New Product</button>
                           </div>

                        </div>

                      </div> 


                    </div> <!-- end of box body -->
                </div>
              </div>         


            </div><!-- end of row -->
           </form>
          </section>



</div>

以下是用于扫描条形码

的输入字段
<input id="barcode" type="text" class="form-control validate filter-input" [(ngModel)]="query" (keyup)="filter()" placeholder="Enter item code or scan the barcode" autocomplete="off">

2 个答案:

答案 0 :(得分:0)

我假设你只使用函数add。我尝试在javascript中实现,如下面的代码,但我很确定你在其他地方引用该对象,而你正在改变它。这是我的结论,但我可能错了。

var factoryP = (function(){

    function P() {
        this.cart = [];
        this.products = [{'barcode': 1, 'name': 'a'}, {'barcode': 1, 'name': 'b'}]

    }

    function add(item) {

          /* check the items in the json data */
          //console.log("cart length "+JSON.stringify(this.cart));
      let flag = false;
      var foodItem = {};
      for (let product of this.products) {

        if(product.barcode == item) {
                //console.log("check "+item);
          flag = true; 
          foodItem['ctr'] = 1;
          foodItem['item'] = product;
          break;
        }
      }

      if(flag && this.cart.length) {

        let exist = 0;

        for(let i=0; i < this.cart.length; i++) {

          if(this.cart[i].item.barcode == item) {
                //console.log("Same product");
            this.cart[i].ctr = parseInt(this.cart[i].ctr) + 1; 
            exist = 1;

          }
        }
        if(!exist){

          console.log(foodItem);
          this.cart.push(foodItem);
        }

      }else if(flag){
        console.log("step 4 "+item);
        this.cart.push(foodItem);

      }


    }

    P.prototype.add = add;
    return  new P();
  });

instanceP = factoryP();
instanceP.add(1);
instanceP.add(1);
instanceP.add(1);
instanceP.add(2);


console.log(instanceP.cart[0].ctr)
//output 3
instanceP.cart[1].ctr
//output 1

答案 1 :(得分:0)

在此处查看您的代码。每次使用空数组初始化foodItem数组时。因此,只要代码调用add方法,它就会先清空你的foodItem数组。

请在下面的代码中查看我的评论:

add(item) {

       let flag = false;

//Akshay: You need to make your changes here. Initialize your foodItem array out of this scope
       var foodItem = {};
       for (let product of this.products) {
         if(product.barcode == item) {
           //console.log("check "+item);
           flag = true; 
           foodItem['ctr'] = 1;
           foodItem['item'] = product;
           break;
         }
       }