如何使用单个AngularJS控制器将JSON对象推送到数组

时间:2018-03-03 14:10:51

标签: angularjs json

  

请指导我如何通过提交新的商品表格,在上述装货对象中推送新的商品对象。我试过的代码如下。

     

注意当我填写商品表格并提交以推送上面的json时,它告诉我undefined for loads.commodities.push

我有一个完整的示例JSON对象(我们称之为加载),其中我必须推送商品对象。对于新商品,我有一个明确的表格来添加新的商品细节并推入现有的装货对象。

加载对象

{
    "loadStops": [
        {
            "companyId": 148,
            "companyCode": null,
            "legalName": "Frontier WHSE",
            "accessorialReason": null,
            "commodities": [{
                "id": 1,
                "commodity": "Food",
                "estWeight": 20000.00
            }]
        }
    ]
}
用于查看加载数据的

显示表和用于添加新商品的表单

<div ng-controller="FreightSaleCtrl">

<table>

    <tr>
        <th> Company Code </th> <th> Legal Name </th>
    </tr>
    <tr ng-repeat="theLoad in loads">
        <td> {{theLoad.companyCode}} </td>
        <td> {{theLoad.legalName}} </td>
    </tr>
    <tr>
        <td colspan="2">
            <table>
                <tr>
                    <th> Commodity </th> <th> EstWeight </th>
                </tr>
                <tr ng-repeat="cmdty in theLoad.commodities">
                    <td> cmdty.commodity </td>
                    <td> cmdty.estWeight </td>
                </tr>
            </table>
        </td>
    </tr>


</table>

</div>


<div>

<form ng-controller="FreightSaleCtrl">
    <input type="text" ng-model="commodityForm.commodity"/>
    <input type="text" ng-model="commodityForm.estWeight"/>
    <input type="submit" value="Add New Commodity"/>
</form>

</div>

我的AngularJS控制器:

(function() {
'use strict';
angular.module('bootstrapApp').controller('FreightSaleCtrl', FreightSaleCtrl);

    function FreightSaleCtrl($scope, $location, $http, $compile) {


        $scope.loads[0].commodities.push( $scope.commodityForm );

    }


});

我的新商品表单,点击商品表中的链接即可打开:**

<div class="modal fade" id="commoditiesModal" tabindex="-1" role="dialog"
    aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog modal-lg" role="document">
    <form ng-controller="FreightSaleCtrl" id="commodity-form" role="form" novalidate>
        <div class="modal-content">
            <div class="modal-header modal-lg">
                <h5 class="modal-title" id="exampleModalLabel">
                    Add Commodity
                    <button type="button" class="close" data-dismiss="modal"
                        aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </h5>
            </div>

            <div class="modal-body">

                    <div class="row">   <!-- row-1 -->
                        <div class="col-sm-3"> <!-- [0, 0] -->
                            <fieldset class="form-group">
                                <label id="fieldTitle">Commodity</label>
                                <input type="text" class="form-control" placeholder="" required data-error="Commodity required">
                                <div class="help-block with-errors"></div>
                            </fieldset>
                        </div>
                        <div class="col-sm-3"> <!-- [0, 1] -->
                            <fieldset class="form-group">
                                <label id="fieldTitle">Est. Weight</label>
                                <input type="text" class="form-control" placeholder="" required data-error="Est. weight required">
                                <div class="help-block with-errors"></div>
                            </fieldset>
                        </div>
                    </div>
            </div>

            <div class="modal-footer">
                <input type="reset" class="btn btn-warning btn-sm" value="Reset" />
                <button type="button" class="btn btn-danger btn-sm" ng-click="clear()"
                    data-dismiss="modal">Close</button>
                <button type="submit" class="btn btn-default btn-sm">
                    <i class="fa fa-check-square-o"></i> Submit
                </button>
            </div>

        </div>
        </form>
    </div>
</div>

当我点击此按钮时,上面的表格会打开:表格中显示的商品:

enter image description here

商品表格模式本身 enter image description here

1 个答案:

答案 0 :(得分:2)

  • 每次指定控制器时,它都会创建新实例 该控制器应该保存在一个控制器内
  • theLoad.commodities无法访问,因为它是

<tr ng-repeat="cmdty in theLoad.commodities"> <td> cmdty.commodity </td> <td> cmdty.estWeight </td> </tr>

解决此问题的一种方法是在表格中添加输入框 - 每次加载

<!DOCTYPE html>
<html>

<head>
  <script data-require="jquery@3.0.0" data-semver="3.0.0" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.js"></script>
  <link data-require="bootstrap@3.3.7" data-semver="3.3.7" rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" />
  <script data-require="angular.js@1.6.6" data-semver="1.6.6" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.6/angular.min.js"></script>
  <script src="https://angular-ui.github.io/bootstrap/ui-bootstrap-tpls-2.5.0.min.js"></script>

  <script>
    (function() {

      var app = angular.module("bootstrapApp", ['ui.bootstrap']);

      app.component('modalComponent', {
        templateUrl: 'myModalContent.html',
        bindings: {
          resolve: '<',
          close: '&',
          dismiss: '&'
        },
        controller: function($scope) {
          var $ctrl = this;
          $ctrl.$onInit = function() {
            $scope.theLoad = $ctrl.resolve.currentLoad;
          };

          $scope.ok = function() {
            $ctrl.close({
              $value: $scope.theLoad
            });
          };
        }
      });

      app.controller('FreightSaleCtrl', ['$scope', '$uibModal', function($scope, $uibModal) {

        $scope.loads = [{
          "companyId": 148,
          "companyCode": 1234,
          "legalName": "Frontier WHSE",
          "accessorialReason": null,
          "commodities": [{
            "id": 1,
            "commodity": "Food",
            "estWeight": 20000.00
          }, {
            "id": 2,
            "commodity": "Another",
            "estWeight": 160000.00
          }]
        }, {
          "companyId": 45,
          "companyCode": 7879,
          "legalName": "ASD froads",
          "accessorialReason": null,
          "commodities": [{
            "id": 10,
            "commodity": "Drinks",
            "estWeight": 5600.00
          }]
        }];



        $scope.openModal = function(load) {
          var modalInstance = $uibModal.open({
            animation: true,
            component: 'modalComponent',
            resolve: {
              currentLoad: function() {
                return load;
              }
            }
          }).result.then(function(currentLoad) {
            if (currentLoad) {
              var maxValue = Math.max.apply(Math, currentLoad.commodities.map(function(o) {
                return o.id;
              }))
              if (!maxValue) {
                maxValue = 0;
              }
              currentLoad.newCommodity.id = maxValue + 1;
              currentLoad.commodities.push(angular.copy(currentLoad.newCommodity));
              currentLoad.newCommodity = undefined;
            }
          }, function() {
            console.log('modal-component dismissed at: ' + new Date());
          });
        };

      }]);

    }());
  </script>
  <style></style>
</head>

<body ng-app="bootstrapApp">
  <div ng-controller="FreightSaleCtrl">

    <script type="text/ng-template" id="myModalContent.html">
      <div class="modal-header">
        <h3 class="modal-title" id="modal-title">Add Commodity !</h3>
      </div>
      <div class="modal-body" id="modal-body">
        <form name="testForm">

          <div class="form-group" ng-class="{ 'has-error' : testForm.commodity.$invalid && !testForm.commodity.$pristine }">
            <label>Commodity</label>
            <input type="text" name="commodity" ng-model="theLoad.newCommodity.commodity" placeholder="Commodity" ng-minlength="3" ng-maxlength="8" required/>
            <p ng-show="testForm.commodity.$error.required && !testForm.commodity.$pristine" class="help-block">commodity is required.</p>
            <p ng-show="testForm.commodity.$error.minlength" class="help-block">commodity is too short.</p>
            <p ng-show="testForm.commodity.$error.maxlength" class="help-block">commodity is too long.</p>
          </div>
          
          
          <div class="form-group" ng-class="{ 'has-error' : testForm.estWeight.$invalid && !testForm.estWeight.$pristine }">
            <label>estWeight</label>
            <input type="text" name="estWeight" ng-model="theLoad.newCommodity.estWeight" placeholder="EST Weight" ng-minlength="3" ng-maxlength="8" required/>
            <p ng-show="testForm.estWeight.$error.required && !testForm.estWeight.$pristine" class="help-block">estWeight is required.</p>
            <p ng-show="testForm.estWeight.$error.minlength" class="help-block">estWeight is too short.</p>
            <p ng-show="testForm.estWeight.$error.maxlength" class="help-block">estWeight is too long.</p>
          </div>
      </div>
      <div class="modal-footer">
        <button class="btn btn-primary" type="button" ng-click="ok()">OK</button>
        <button class="btn btn-warning" type="button" ng-click="cancel()">Cancel</button>
      </div>
      </form>
    </script>

    <form name="commonForm">

      <table class="table">

        <tr>
          <th> Company Code </th>
          <th> Legal Name </th>
          <th> Commodity </th>
          <th> EstWeight </th>
        </tr>
        <tr ng-repeat="theLoad in loads">
          <td> {{theLoad.companyCode}} </td>
          <td> {{theLoad.legalName}} </td>
          <td colspan="2">

            <table class="table">
              <tr ng-repeat="cmdty in theLoad.commodities track by cmdty.id">
                <td>{{cmdty.id}} {{cmdty.commodity}} </td>
                <td> {{cmdty.estWeight}} </td>
              </tr>
              <tr>
                <td colspan="2">
                  <input class="pull-right" type="button" value="Add" ng-click="openModal(theLoad)" />
                </td>
              </tr>
            </table>

          </td>
        </tr>
      </table>

    </form>

  </div>
</body>

</html>