AngularJs - ng-model in a SELECT

后端 未结 6 1101
执念已碎
执念已碎 2020-12-23 15:58

JSfiddle

Problem:

I have a SELECT-element in my page, which is filled in with an ng-repeat. It also has a ng-model

相关标签:
6条回答
  • 2020-12-23 16:40

    You can use the ng-selected directive on the option elements. It takes expression that if truthy will set the selected property.

    In this case:

    <option ng-selected="data.unit == item.id" 
            ng-repeat="item in units" 
            ng-value="item.id">{{item.label}}</option>
    

    Demo

    angular.module("app",[]).controller("myCtrl",function($scope) {
        $scope.units = [
            {'id': 10, 'label': 'test1'},
            {'id': 27, 'label': 'test2'},
            {'id': 39, 'label': 'test3'},
        ]
    
            $scope.data = {
            'id': 1,
            'unit': 27
            }
    
    });
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <div ng-app="app" ng-controller="myCtrl">
        <select class="form-control" ng-change="unitChanged()" ng-model="data.unit">
             <option ng-selected="data.unit == item.id" ng-repeat="item in units" ng-value="item.id">{{item.label}}</option>
        </select>
    </div>

    0 讨论(0)
  • 2020-12-23 16:41

    Select's default value should be one of its value in the list. In order to load the select with default value you can use ng-options. A scope variable need to be set in the controller and that variable is assigned as ng-model in HTML's select tag.

    View this plunker for any references:

    http://embed.plnkr.co/hQiYqaQXrtpxQ96gcZhq/preview

    0 讨论(0)
  • 2020-12-23 16:42

    You can also put the item with the default value selected out of the ng-repeat like follow :

    <div ng-app="app" ng-controller="myCtrl">
        <select class="form-control" ng-change="unitChanged()" ng-model="data.unit">
            <option value="yourDefaultValue">Default one</option>
            <option ng-selected="data.unit == item.id" ng-repeat="item in units" ng-value="item.id">{{item.label}}</option>
        </select>
    </div>
    

    and don't forget the value atribute if you leave it blank you will have the same issue.

    0 讨论(0)
  • 2020-12-23 16:46

    However, ngOptions provides some benefits such as reducing memory and increasing speed by not creating a new scope for each repeated instance. angular docs

    Alternative solution is use ng-init directive. You can specify function that will be initialize your default data.

    $scope.init = function(){
                angular.forEach($scope.units, function(item){
                    if(item.id === $scope.data.unit){
                        $scope.data.unit = item;
                    }
                });
            } 
    

    See jsfiddle

    0 讨论(0)
  • 2020-12-23 16:53

    You dont need to define option tags, you can do this using the ngOptions directive: https://docs.angularjs.org/api/ng/directive/ngOptions

    <select class="form-control" ng-change="unitChanged()" ng-model="data.unit" ng-options="unit.id as unit.label for unit in units"></select>
    
    0 讨论(0)
  • 2020-12-23 16:57

    try the following code :

    In your controller :

     function myCtrl ($scope) {
          $scope.units = [
             {'id': 10, 'label': 'test1'},
             {'id': 27, 'label': 'test2'},
             {'id': 39, 'label': 'test3'},
          ];
    
       $scope.data= $scope.units[0]; // Set by default the value "test1"
     };
    

    In your page :

     <select ng-model="data" ng-options="opt as opt.label for opt in units ">
                    </select>
    

    Working Fiddle

    0 讨论(0)
提交回复
热议问题