Angularjs 如何在单击保存按钮时从动态创建的输入文本框中获取数据
How to fetch data from dynamically created input textboxes on click of save button in Angularjs
我正在为每个项目动态创建文本框和保存按钮,在单击保存按钮时我需要从该特定项目的文本框中获取值。
for (let d = 0; d <= ItemsInfo.length - 1; d++)
{
content += '<tr> <td> <label for="lblPriority">Item Priority </label> </td> ';
content += ' <td> <input type="text" id="inpItemPRIORITY" ng-model="prty" value=" ' + ItemsInfo[d].PRIORITY + ' " /> </td> </tr>';
content += '<tr> <td> <label for="lblItemComment">Item Comment</label></td> ';
content += ' <td> <input type="text" id="inpItemCOMMENT" ng-model="cmnt" value=" ' + ItemsInfo[d].COMMENT + ' " /> </td> </tr>';
// Save Item
content += '<tr> <td> <button class="get-data" ng-click="buttonClick(prty,cmnt)">Save Item(' + ItemsInfo[d].ITEM_ID + ')</button> </td> </tr> ';
}
在控制器中:
$scope.buttonClick = function (prty,cmnt) {
console.log(prty + " " + cmnt); } // console.log displays as undefined undefined
或者有更好的方法吗?
作为开始,正确的 AngularJs 应该是直接在您的 HTML 模板中使用 ngRepeat,但我仍然使用您当前的代码为您提供解决方案:
首先,HTML id 应该是唯一的,您在控制器中的数组上手动循环,因此您可以向 id 添加一个索引号,并将其提供给您的函数以查找元素(还修复了用于优化的 for 循环条件):
在这种情况下,绑定到模型是没有用的,否则所有输入都将使用相同的范围变量。此代码还显示了在 AngularJS:
中以 jQlite 格式检索 DOM 元素的正确方法
for (let d = 0; d < ItemsInfo.length; d++)
{
content += '<tr> <td> <label for="lblPriority">Item Priority </label> </td> ';
content += ' <td> <input type="text" id="inpItemPRIORITY_' + d + '" value="' + ItemsInfo[d].PRIORITY + '" /> </td> </tr>';
content += '<tr> <td> <label for="lblItemComment">Item Comment</label></td> ';
content += ' <td> <input type="text" id="inpItemCOMMENT_' + d + '" value="' + ItemsInfo[d].COMMENT + '" /> </td> </tr>';
// Save Item
content += '<tr> <td> <button class="get-data" ng-click="buttonClick(' + d + ')">Save Item(' + ItemsInfo[d].ITEM_ID + ')</button> </td> </tr> ';
}
$scope.buttonClick = function (index) {
let prty = angular.element( document.querySelector( '#inpItemPRIORITY_' + index ) ),
cmnt = angular.element( document.querySelector( '#inpItemCOMMENT_' + index ) );
console.log(prty.val() + " " + cmnt.val());
};
这里是演示的片段。只是一个例子来证明它有效(编辑:添加 $compile
指令 buttonClick
正常工作)。
angular.module('selectExample', [])
.controller('ExampleController', ['$scope', function($scope) {
const ItemsInfo = [
{ ITEM_ID: 'a1', COMMENT: 'comment a1', PRIORITY: 0 },
{ ITEM_ID: 'b1', COMMENT: 'comment b1', PRIORITY: 1 },
{ ITEM_ID: 'c1', COMMENT: 'comment c1', PRIORITY: 2 },
];
let content = '';
for (let d = 0; d < ItemsInfo.length; d++)
{
content += '<tr> <td> <label for="lblPriority">Item Priority </label> </td> ';
content += ' <td> <input type="text" id="inpItemPRIORITY_' + d + '" value=" ' + ItemsInfo[d].PRIORITY + ' " /> </td> </tr>';
content += '<tr> <td> <label for="lblItemComment">Item Comment</label></td> ';
content += ' <td> <input type="text" id="inpItemCOMMENT_' + d + '" value=" ' + ItemsInfo[d].COMMENT + ' " /> </td> </tr>';
// Save Item
content += '<tr> <td> <button class="get-data" ng-click="buttonClick(' + d + ')">Save Item(' + ItemsInfo[d].ITEM_ID + ')</button> </td> </tr> ';
}
$scope.htmlContent = content;
$scope.buttonClick = function (index) {
let prty = angular.element( document.querySelector( '#inpItemPRIORITY_' + index ) ),
cmnt = angular.element( document.querySelector( '#inpItemCOMMENT_' + index ) );
console.log(prty.val() + " " + cmnt.val());
};
}])
.directive('bindHtmlCompile', ['$compile', function ($compile) {
return {
restrict: 'A',
link: function (scope, element, attrs) {
scope.$watch(function () {
return scope.$eval(attrs.bindHtmlCompile);
}, function (value) {
element.html(value);
$compile(element.contents())(scope);
});
}
};
}]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular-sanitize.min.js"></script>
<div ng-app="selectExample" ng-controller="ExampleController">
<table bind-html-compile="htmlContent"></table>
</div>
我正在为每个项目动态创建文本框和保存按钮,在单击保存按钮时我需要从该特定项目的文本框中获取值。
for (let d = 0; d <= ItemsInfo.length - 1; d++)
{
content += '<tr> <td> <label for="lblPriority">Item Priority </label> </td> ';
content += ' <td> <input type="text" id="inpItemPRIORITY" ng-model="prty" value=" ' + ItemsInfo[d].PRIORITY + ' " /> </td> </tr>';
content += '<tr> <td> <label for="lblItemComment">Item Comment</label></td> ';
content += ' <td> <input type="text" id="inpItemCOMMENT" ng-model="cmnt" value=" ' + ItemsInfo[d].COMMENT + ' " /> </td> </tr>';
// Save Item
content += '<tr> <td> <button class="get-data" ng-click="buttonClick(prty,cmnt)">Save Item(' + ItemsInfo[d].ITEM_ID + ')</button> </td> </tr> ';
}
在控制器中:
$scope.buttonClick = function (prty,cmnt) {
console.log(prty + " " + cmnt); } // console.log displays as undefined undefined
或者有更好的方法吗?
作为开始,正确的 AngularJs 应该是直接在您的 HTML 模板中使用 ngRepeat,但我仍然使用您当前的代码为您提供解决方案:
首先,HTML id 应该是唯一的,您在控制器中的数组上手动循环,因此您可以向 id 添加一个索引号,并将其提供给您的函数以查找元素(还修复了用于优化的 for 循环条件):
在这种情况下,绑定到模型是没有用的,否则所有输入都将使用相同的范围变量。此代码还显示了在 AngularJS:
中以 jQlite 格式检索 DOM 元素的正确方法for (let d = 0; d < ItemsInfo.length; d++)
{
content += '<tr> <td> <label for="lblPriority">Item Priority </label> </td> ';
content += ' <td> <input type="text" id="inpItemPRIORITY_' + d + '" value="' + ItemsInfo[d].PRIORITY + '" /> </td> </tr>';
content += '<tr> <td> <label for="lblItemComment">Item Comment</label></td> ';
content += ' <td> <input type="text" id="inpItemCOMMENT_' + d + '" value="' + ItemsInfo[d].COMMENT + '" /> </td> </tr>';
// Save Item
content += '<tr> <td> <button class="get-data" ng-click="buttonClick(' + d + ')">Save Item(' + ItemsInfo[d].ITEM_ID + ')</button> </td> </tr> ';
}
$scope.buttonClick = function (index) {
let prty = angular.element( document.querySelector( '#inpItemPRIORITY_' + index ) ),
cmnt = angular.element( document.querySelector( '#inpItemCOMMENT_' + index ) );
console.log(prty.val() + " " + cmnt.val());
};
这里是演示的片段。只是一个例子来证明它有效(编辑:添加 $compile
指令 buttonClick
正常工作)。
angular.module('selectExample', [])
.controller('ExampleController', ['$scope', function($scope) {
const ItemsInfo = [
{ ITEM_ID: 'a1', COMMENT: 'comment a1', PRIORITY: 0 },
{ ITEM_ID: 'b1', COMMENT: 'comment b1', PRIORITY: 1 },
{ ITEM_ID: 'c1', COMMENT: 'comment c1', PRIORITY: 2 },
];
let content = '';
for (let d = 0; d < ItemsInfo.length; d++)
{
content += '<tr> <td> <label for="lblPriority">Item Priority </label> </td> ';
content += ' <td> <input type="text" id="inpItemPRIORITY_' + d + '" value=" ' + ItemsInfo[d].PRIORITY + ' " /> </td> </tr>';
content += '<tr> <td> <label for="lblItemComment">Item Comment</label></td> ';
content += ' <td> <input type="text" id="inpItemCOMMENT_' + d + '" value=" ' + ItemsInfo[d].COMMENT + ' " /> </td> </tr>';
// Save Item
content += '<tr> <td> <button class="get-data" ng-click="buttonClick(' + d + ')">Save Item(' + ItemsInfo[d].ITEM_ID + ')</button> </td> </tr> ';
}
$scope.htmlContent = content;
$scope.buttonClick = function (index) {
let prty = angular.element( document.querySelector( '#inpItemPRIORITY_' + index ) ),
cmnt = angular.element( document.querySelector( '#inpItemCOMMENT_' + index ) );
console.log(prty.val() + " " + cmnt.val());
};
}])
.directive('bindHtmlCompile', ['$compile', function ($compile) {
return {
restrict: 'A',
link: function (scope, element, attrs) {
scope.$watch(function () {
return scope.$eval(attrs.bindHtmlCompile);
}, function (value) {
element.html(value);
$compile(element.contents())(scope);
});
}
};
}]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular-sanitize.min.js"></script>
<div ng-app="selectExample" ng-controller="ExampleController">
<table bind-html-compile="htmlContent"></table>
</div>