访问动态创建的文本字段的值

时间:2018-07-20 21:53:08

标签: javascript html angularjs

我有一个网页,要求用户输入网络数。根据用户提供的数字,它创建相应数量的文本输入字段。然后,用户在这些新创建的框中输入网络地址,当用户单击验证时,它将对每个网络执行ping操作。

现在,我设法在输入字段上完成了动态创建,但是现在访问它们的值时遇到了问题。请参见下面的代码和jsfiddle:

HTML:

<div ng-app>
    <div ng-controller="Controller">
        <div class="form-group" id = "numNetDiv" style="display:block">
            <div class="col-sm-3">
                <label for="numNetworks">Number of Networks</label>
                <input id="numNetworks" ng-model="numNetworks"
                       ng-change="addNetworkFields()" type="text"
                       class="form-control"  required />
                <div class="col-sm-3" id="container" style="margin-left: 50px"> 
                </div>
            </div>
        </div>

        <div class="form-group" id = "checkNetsDiv" style="display:block">
            <div>
                <button id="checkNets" type="button" class="btn btn-nets"
                        style="margin-left: 100px"
                        ng-click="checkNets()">
                  Validate
                </button>
            </div>
        </div>
        <p id="demo"></p>
    </div>
</div>

angularjs:

// Add input boxes based on # of networks
function Controller($scope){
    $scope.count=0;
    $scope.addNetworkFields = function() {
    var number = document.getElementById("numNetworks").value;
    console.log(number);
    var container = document.getElementById("container");
    while (container.hasChildNodes()) {
        container.removeChild(container.lastChild);
    }
    for (i=0;i<number;i++){
        container.appendChild(document.createTextNode("Network" + (i+1) + ": "));
        var input = document.createElement("input");
        input.type = "text";
        container.appendChild(input);
        container.appendChild(document.createElement("br"));
        }
     }
   // Run ping on each subnet
   $scope.checkNets = function() {
   console.log('Click!')
   var number = document.getElementById("numNetworks").value;
   for (i=0;i<number;i++){
   //Access each networks and run ping on each one after another

   // Call below for each network to perform ping
   var ping = $.param({network: $scope.network[i]}); // [i] to access each network?  Just an idea
   $http({
            url: 'https://' + location.hostname + '/ping_network',
            method: "POST",
            data: ping
        })
        .then(function(response) {
    $scope.pingResult = response.data;
    })

   }
   }

 }

https://jsfiddle.net/Lwy378ce/137/

我知道POST可以工作,而我唯一遇到的问题是一个一个地访问每个网络并在其上调用该POST。为了进行测试,我们可以使用整个POST代码,并用console.log(network [i])之类的东西替换它,然后查看console是否可以列出所有网络。

谢谢 达蒙

2 个答案:

答案 0 :(得分:2)

如果您仅使用表单和Angular js模型,它将更加简单。您可以使用ng-repeat创建字段,将这些输入字段的ng-model设置为网络地址,然后将这些地址用于ping。提交表单时可以轻松更新的地址。另外,通过使用ng-show,您可以隐藏该验证按钮,直到有用为止。

代码也少得多。

angular.module('myApp', [])
  .controller('myAppCtrl', function($scope){
	
	$scope.number = 0;
	$scope.addNetworkFields = function(value) {
		$scope.networks = [];
		for(var i = 1; i <= parseInt(value); i++){
			var network = {number : i, address: ""}
			$scope.networks.push(network)
		}
	}
	
  $scope.submit = function() {
    for(var i = 0; i < $scope.networks.length; i++){
      console.log($scope.networks[i].address)
    }
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<body ng-app="myApp" ng-controller="myAppCtrl as ctrl" ng-cloak layout="column" layout-fill>
  <form  ng-submit="submit()" class="form-group" id = "numNetDiv" style="display:block">
    <div class="col-sm-3">
      <label for="numNetworks">Number of Networks</label>
      <input id="numNetworks" ng-model="number"
             ng-change="addNetworkFields(number)" type="number"
             class="form-control"  required />
      <div class="col-sm-3" id="container" style="margin-left: 50px">
        <div ng-repeat="network in networks">
          <label>Networks {{network.number}}
          <input ng-model="network.address"
                 type="text" class="form-control" /></label>
        </div>
        <input ng-show="number > 0" type="submit" value="validate"/>
      </div>
    </div>
  </form>
</body>

答案 1 :(得分:1)

在这里:将id设置为每个input,然后再通过ID获取。

// Add input boxes based on # of networks
function Controller($scope) {
  $scope.count = 0;
  $scope.addNetworkFields = function() {
    var number = document.getElementById("numNetworks").value;
    console.log(number);
    var container = document.getElementById("container");
    while (container.hasChildNodes()) {
      container.removeChild(container.lastChild);
    }
    for (i = 0; i < number; i++) {
      container.appendChild(document.createTextNode("Network" + (i + 1) + ": "));
      var input = document.createElement("input");
      input.type = "text";
      input.id = "network" + (i + 1);
      container.appendChild(input);
      container.appendChild(document.createElement("br"));
    }
  }
  // Run ping on each subnet
  $scope.checkNets = function() {
    console.log('Click!')
    var number = document.getElementById("numNetworks").value;
    for (i = 0; i < number; i++) {
      //Access each networks and run ping on each one after another
      var network = document.getElementById("network" + (i + 1)).value

      // Call below for each network to perform ping
      var ping = $.param({
        network: $scope.network
      });
      $http({
          url: 'https://' + location.hostname + '/ping_network',
          method: "POST",
          data: ping
        })
        .then(function(response) {
          $scope.pingResult = response.data;
        })

    }
  }

}