在AngularJS中动态填充下拉列表
Populate dropdown list dynamically in AngularJS
我正在尝试基于文档字段的键并使用AngularJS中的ng-if
属性生成动态表单。
例如:
- If field name is "name|string" then populate textfield
- If field name is "name|select" then populate dropdownlist
- If field name is "name|datepicker" then populate datepicker
以下是代码:
<div class="form-group" ng-repeat="(index, formVal) in providerModelData" ng-if="!$first">
<label>{{mySplit(index,0) | uppercase}}</label>
<div ng-if="!mySplit(index,1)">
<input type="text" class="form-control" ng-model="providerModelData[index]">
</div>
<div ng-if="mySplit(index,1) == 'datepicker'">
<input type="text" class="form-control" ng-model="providerModelData[index]">
</div>
<div ng-if="mySplit(index,1) == 'select'">
<select class="form-control" ng-init="getDropdownData(index,colName)" ng-options="dropdown._id for dropdown in dropdownData[colName]">
<option value="">Select</option>
</select>
</div>
</div>
控制器:
$scope.mySplit = function(string, nb) {
var array = string.split('|');
return array[nb];
}
textfields
在填充数据时工作良好,但在填充下拉字段时遇到了问题。
示例:我的mongodb文档中有两个下拉字段,即city|select
和state|select
我试图使用ng-options
通过传递index和colName(文档名称)来调用函数,以填充dropdownlist,但它不起作用。
以下是代码:
$scope.dropdownData = {};
$scope.getDropdownData = function (query, colName) {
$http.get('/getdropdowndata/', {
params: {
query: query,
colName: colName
}
}).success(function (response) {
$scope.dropdownData[colName] = response;
});
};
快递:
router.route('/').get(function (req, res) {
var url_parts = url.parse(req.url, true);
var query = url_parts.query;
console.log(query.query);
db.collection(query.colName).aggregate([{
"$group":{
"_id":"$"+query.query
}
}],function (err, docs) {
console.log(docs);
res.json(docs);
});
});
起初,我尝试在ng-repeat
中调用函数,但它进入了内场循环。后来我尝试了ng-init
选项,但它只调用或初始化一次,这在我的情况下不起作用。在这里,我需要动态调用函数,并在此基础上填充不同字段的下拉列表。
如有任何帮助,我们将不胜感激。
据我所见,您的视图完全混乱,您缺少
ng-model
以供您选择输入。
您的JSON不正确——{'id_':'Arizona'}
之前缺少,
尝试在你的控制器中获得响应,并将其推送到数组中,并在你的视图中使用该数组:
$scope.getDropdownData=function(query, colName){
$http.get('/getdropdowndata/', {
params: {
query: query,
colName:colName
}
}).success(function (response) {
var returnArray = [];
alert(JSON.stringify(response));
angular.ForEach(response,function(option){
//parse response and push it to returnArray
returnArray.push(option);
});
return returnArray;
});
}
视图:
<div class="form-group">
<select class="form-control" ng-model="selection" ng-options="dropdown._id for dropdown in getDropDownData()">
<option value="">Select</option>
</select>
</div>
这是Codepen的链接.
考虑以下解决方案:
在控制器中,为下拉数据设置一个变量:
$scope.dropdownData = {};
然后将getDropdownData
功能更改为:
$scope.getDropdownData=function(query, colName){
$http.get('/getdropdowndata/', {
params: {
query: query,
colName:colName
}
}).success(function (response) {
alert(JSON.stringify(response));
$scope.dropdownData[colName] = response; // This will put data into our html file
});
}
下拉框的HTML应该是:
<div ng-if="mySplit(index,1) == 'select'">
<select class="form-control" ng-init="getDropdownData(index,colName)" ng-options="dropdown._id for dropdown in dropdownData[colName]">
<option value="">Select</option>
</select>
</div>
我使用了臭名昭著的ngInit来调用服务器的数据。也许还有一个我没有考虑过的更好的方法。但在任何情况下,我们的想法都是调用服务器,并以一种可以轻松从视图中获取数据的方式保存数据。
编辑
我不知道为什么,但由于某种原因,这个解决方案不适用于ng-options
。然而,当这样使用它时,它确实有效:
<select class="form-control" ng-init="getDropdownData(index,colName)">
<option value="">Select</option>
<option ng-repeat="dropdown in dropdownData[colName]" value="dropdown._id">{{dropdown._id}}</option>
</select>
这里有一个简单的例子。
最后我自己解决了。感谢@Rishab777和@yarons的指导。
这是视图代码:
<div ng-if="mySplit(index, 1) == 'select'">
<select class="form-control">
<option value="">Select</option>
<option ng-model="providerModelData[index]" ng-selected="providerModelData[index]" ng-repeat="dropdown in dropdownData[index]" value="{{dropdown._id}}">{{dropdown._id}}</option>
</select>
</div>
和控制器:
$scope.showModal = false;
$scope.toggleModal = function (colId, colName) {
$http.get('/collectiondata/' + colId + '/collectionName/' + colName).success(function (response) {
$scope.colName = colName;
$scope.colId = colId;
for (var key in response) {
if (response.hasOwnProperty(key)) {
if ($scope.mySplit(key, 1) === 'select') {
$scope.getDropdownData(key, colName);
}
}
}
$scope.providerModelData = response;
$scope.showModal = !$scope.showModal;
});
};
$scope.dropdownData = {};
$scope.getDropdownData = function (query, colName) {
$http.get('/getdropdowndata/', {
params: {
query: query,
colName: colName
}
}).success(function (response) {
$scope.dropdownData[query] = response;
});
};
现在的问题是ng-selected="providerModelData[index]"
不起作用,它只显示最后一项为选中项。
- 无法使用国家/地区选择中的状态动态填充下拉列表
- 通过使用AngularJs进行分组来填充下拉列表
- 如何填充下拉列表,从javascript中的另一个下拉列表中排除任何一个选项
- 使用 MySQL 条目填充下拉列表
- 如何使用其他下拉列表中未选择的选项填充下拉列表
- 使用jquery动态填充下拉列表
- 在AngularJS中动态填充下拉列表
- 使用数据库返回的数据动态填充下拉列表
- 设置 AJAX 调用和填充下拉列表
- 使用 ajax 和 JSP Servlet 根据选择的上一个下拉列表填充下拉列表
- 在 JavaScript 中使用 MySQL 数据库中的数据填充下拉列表
- 如何在 jQuery 中用 JSON 数据填充下拉列表作为 ajax 响应
- 使用 ajax 用 SQL 填充下拉列表
- 如何使用 JavaScript 中的值填充下拉列表
- 如何在信息窗口中填充下拉列表(谷歌地图API v3)
- 从 Javascript 和 Java 返回的数组中填充下拉列表
- 使用 AJAX 和 ORACLE 以及不使用 php 填充下拉列表(选择 )
- 单击第一项时重新填充下拉列表
- 尝试使用 jquery 和 ajax 填充下拉列表
- 如何使用 javascript 清空下拉列表后重新填充下拉列表