【问题标题】:Populate dropdown list dynamically in AngularJS在 AngularJS 中动态填充下拉列表
【发布时间】:2016-04-05 12:04:53
【问题描述】:

我正在尝试根据文档字段的键并在 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|selectstate|select

我正在尝试使用 ng-options 通过传递 index 和 colName(文档名称)来调用函数来填充下拉列表,但它不起作用。

以下是代码:

    $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 选项,但它只调用或初始化一次,这在我的情况下不起作用。在这里,我需要动态调用函数,并根据我想要填充不同字段的下拉列表。

任何帮助将不胜感激。

【问题讨论】:

  • 问题出在"dropdown._id for dropdown in getDropdownData(index,colName)"getDropdownData 是一个函数,而不是一个集合。您需要将该函数调用的结果保存到范围变量,并将该变量用于ng-options
  • 如何在角度表达式中使用 $scope 变量?因为我是从我的view 而不是控制器调用函数
  • 您能否提供 JSBin 或 Codepen 与您的代码,当您硬编码服务器 I.getDropDownApi 的响应而不发送请求并从服务器接受它时会发生什么??
  • 如果您可以提供来自服务器的响应结构和 providerModelData 的内部结构以及每个请求和响应结构,那将会很有帮助..?

标签: javascript angularjs mongodb mean-stack


【解决方案1】:

据我所知,你的观点完全一团糟

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的链接 .

【讨论】:

  • 是的,但是您能否提供一个示例,说明您从服务器获取的内容以及上述解决方案是否有效??
  • 我尝试了@yarons 解决方案,但它没有在下拉列表中填充数据
  • 这是我从服务器[ { _id: 'LA' }, { _id: 'LA' }, { _id: 'Denver' }, { _id: 'LR' } ] [ { _id: 'Arizona' } { _id: 'California' }, { _id: 'Arizona' } ]得到的
  • 这是一个无效的 json,在 { _id: 'Arizona' } 之前缺少逗号??
  • 它是从mongodb/express生成的
【解决方案2】:

考虑以下解决方案:
在您的控制器中,为下拉数据设置一个变量:

$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>

看一个简单的例子here

【讨论】:

  • 我试过这个但没有用。下拉列表不填充数据
  • 您是否尝试过调试您的 Angular 代码以验证正在调用 getDropdownData 函数?
  • 是的函数被调用并返回对象但不在下拉列表中填充数据
  • 在我的回答中,我用一个空对象 {} 初始化了 $scope.dropdownData。你用一个空数组初始化你的。
  • 这是我的城市数组:[ { _id: 'LA' }, { _id: 'LA' }, { _id: 'Denver' }, { _id: 'LR' } ],这是州[ { _id: 'Arizona' } { _id: 'California' }, { _id: 'Arizona' } ]。数组格式是否正确?
【解决方案3】:

最后我自己解决了。感谢@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]" 无法正常工作,并且仅显示最后一项。

【讨论】:

    猜你喜欢
    • 2019-06-06
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 2023-04-03
    • 2020-06-26
    • 2015-12-11
    • 2014-03-01
    相关资源
    最近更新 更多