4

I am creating a simple angularJs application for my own learning purpose. I have attached the code snippets below. I have two JSON data.

One represents the collection of grocery items and other the items that user selected. If the selected data matches to that of collection data, I am marking the checkbox as checked. I can insert the data on click of the checkbox, but if I randomly start to uncheck, it is not functioning properly. I would appreciate your help for correcting me where I am making mistake. Also, I would appreciate if there is any easy way of comparing JSON data. Here I am using name to compare. Is there any other simple way of comparing the individual object inside JSON, without mentioning name or type as I did in my example, in angularJs or Javascript?

(function() {
  angular.module("groceryApp", []).controller("groceryController", groceryControllerFunction);
  groceryControllerFunction.$inject = ["$scope", "$filter"];

  function groceryControllerFunction($scope, $filter) {
    $scope.groceryCollection = groceryCollection_JSON;
    $scope.selectedItems = selectedItems_JSON;
    $scope.toggleSelection = function(item) {
      var isRemoved = false;
      if ($scope.selectedItems.length > 0) {
        for (var i = 0; i < $scope.selectedItems.length; i++) {
          if ($scope.selectedItems[i].name.indexOf(item.name) > -1) {
            $scope.selectedItems.splice($scope.selectedItems.indexOf(item), 1);
            isRemoved = true;
            break;
          }
          console.log("Checking..." + $scope.selectedItems[i].name.indexOf(item.name));
        }
      }
      //     else {
      if (!isRemoved) {
        $scope.selectedItems.push(item);
      }
      //   }
      console.log($scope.selectedItems)
    }
    $scope.addCustomItem = function() {}
  }
  var groceryCollection_JSON = [{
    "name": "Tomato",
    "type": "Roma"
  }, {
    "name": "Cauliflower",
    "type": "Organic"
  }, {
    "name": "Apple",
    "type": "Gala"
  }, {
    "name": "Orange",
    "type": "Sweet n' Sour"
  }, {
    "name": "Grapes",
    "type": "Wild"
  }];
  var selectedItems_JSON = [{
    "name": "Tomato",
    "type": "Roma"
  }];
})();
<!DOCTYPE html>
<html ng-app="groceryApp">

<head>
  <meta charset="utf-8">
  <meta name="description" content="First Angular App">
  <meta name="keywords" content="HTML, Javascript, AngularJs">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="https://code.angularjs.org/1.6.1/angular.min.js"></script>
  <script src="app.js"></script>
  <title>A simple AngularJs Application</title>
</head>

<body ng-controller="groceryController">
  <h1>Welcome to my Grocery Store</h1>
  <p>Select your items from the options below.</p>
  <div ng-repeat="item in groceryCollection">
    <input type="checkbox" id="{{item.name}}" value="{{item.name}}" ng-checked="selectedItems[$index].name.indexOf(item.name)>-1" ng-click="toggleSelection(item)">
    <label for="{{item.name}}">{{item.name}}</label>
    <input type="number" step="1" min="0" max="5" placeholder="Quantity" />
  </div>
  <p>
    <input type="checkbox" id="others">
    <label for="others">Others</label>
  </p>
  <p>Please Enter your item if not displayed in the list above:</p>
  <p id="extraItems"> <span><input type="text" placeholder="Please Enter your Item" ng-model="customItem"/></span>  <span><input type="text" placeholder="Please Enter your Item Type" ng-model="customItemType"/></span>  <span><input type="number" step="1" min="0" max="5" placeholder="Quantity"/></span> 
  </p>
  <p>
    <input type="button" value="Add Item" ng-click="addItem();" />
  </p>
  <p> <a href="#">Add more items</a> 
  </p>
  <div>
    <p>Your selected items:</p>
    <table>
      <tr>
        <th>Name</th>
        <th>Type</th>
      </tr>
      <tr ng-repeat="selection in selectedItems">
        <td>{{selection.name}}</td>
        <td>{{selection.type}}</td>
      </tr>
    </table>
  </div>
</body>

</html>

1 Answer 1

1

You can just use selected flag on the items inside groceryCollection.

This gets rid of toggleSelection i.e. reduces to ng-click="item.selected = !item.selected"

and ng-checked is just item.selected.

The selected items simply filtered as ng-repeat="selection in groceryCollection | filter: {selected:true}"

All you are doing is in this process of selection we are only marking items that are selected.

(function() {
  angular.module("groceryApp", []).controller("groceryController", groceryControllerFunction);
  groceryControllerFunction.$inject = ["$scope", "$filter"];

  function groceryControllerFunction($scope, $filter) {
    $scope.groceryCollection = groceryCollection;
    
    $scope.addCustomItem = function() {}
  }
  var groceryCollection = [{
    "name": "Tomato",
    "type": "Roma"
  }, {
    "name": "Cauliflower",
    "type": "Organic"
  }, {
    "name": "Apple",
    "type": "Gala"
  }, {
    "name": "Orange",
    "type": "Sweet n' Sour"
  }, {
    "name": "Grapes",
    "type": "Wild"
  }];
  
})();
<!DOCTYPE html>
<html ng-app="groceryApp">

<head>
  <meta charset="utf-8">
  <meta name="description" content="First Angular App">
  <meta name="keywords" content="HTML, Javascript, AngularJs">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="https://code.angularjs.org/1.6.1/angular.min.js"></script>
  <script src="app.js"></script>
  <title>A simple AngularJs Application</title>
</head>

<body ng-controller="groceryController">
  <h1>Welcome to my Grocery Store</h1>
  <p>Select your items from the options below.</p>
  <div ng-repeat="item in groceryCollection">
    <input type="checkbox" id="{{item.name}}" value="{{item.name}}" ng-checked="item.selected" ng-click="item.selected = !item.selected">
    <label for="{{item.name}}">{{item.name}}</label>
    <input type="number" step="1" min="0" max="5" placeholder="Quantity" />
  </div>
  <p>
    <input type="checkbox" id="others">
    <label for="others">Others</label>
  </p>
  <p>Please Enter your item if not displayed in the list above:</p>
  <p id="extraItems"> <span><input type="text" placeholder="Please Enter your Item" ng-model="customItem"/></span>  <span><input type="text" placeholder="Please Enter your Item Type" ng-model="customItemType"/></span>  <span><input type="number" step="1" min="0" max="5" placeholder="Quantity"/></span> 
  </p>
  <p>
    <input type="button" value="Add Item" ng-click="addItem();" />
  </p>
  <p> <a href="#">Add more items</a> 
  </p>
  <div>
    <p>Your selected items:</p>
    <table>
      <tr>
        <th>Name</th>
        <th>Type</th>
      </tr>
      <tr ng-repeat="selection in groceryCollection | filter: {selected:true}">
        <td>{{selection.name}}</td>
        <td>{{selection.type}}</td>
      </tr>
    </table>
  </div>
</body>

</html>

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.