Angular.js 선택 상자에서 기본 옵션을 사용하는 방법


311

Google을 검색했는데 이에 대한 내용을 찾을 수 없습니다.

이 코드가 있습니다.

<select ng-model="somethingHere" 
        ng-options="option.value as option.name for option in options"
></select>

이런 데이터로

options = [{
   name: 'Something Cool',
   value: 'something-cool-value'
}, {
   name: 'Something Else',
   value: 'something-else-value'
}];

그리고 출력은 이와 같습니다.

<select ng-model="somethingHere"  
        ng-options="option.value as option.name for option in options" 
        class="ng-pristine ng-valid">

    <option value="?" selected="selected"></option>
    <option value="0">Something Cool</option>
    <option value="1">Something Else</option>
</select>

데이터의 첫 번째 옵션을 기본값으로 설정하여 어떻게 결과를 얻을 수 있습니까?

<select ng-model="somethingHere" ....>
    <option value="0" selected="selected">Something Cool</option>
    <option value="1">Something Else</option>
</select>

3
각도가 옵션을 만드는 데 사용되었다고 가정하지 않은 대답이 있다면 좋을 것입니다. 옵션이 이미 마크 업의 일부라면?
pspahn

1
@pspahn-docs.angularjs.org/api/ng/directive/ngOptions에 따름 : a **single** hard-coded <option> element ... can be nested into the <select> element.옵션은 이미 마크 업에 포함되지 않았습니다.
DIMM Reaper

1
OP에 대답하지는 않지만 매우 다른 질문에 @pspahn ...
Mario Trucco

답변:


366

당신은 간단하게 사용할 수있는 겨 - 초기화 같은를

<select ng-init="somethingHere = options[0]" 
        ng-model="somethingHere" 
        ng-options="option.name for option in options">
</select>

20
나는이 작업에 문제가 있었는데, 누군가가 줄을 내리는 데 도움이되는 경우를 대비하여 '트랙 바이'를 사용하여 문제를 해결했다는 것입니다 : D
DrCord

61
이 답변에는 아무런 문제가 없지만 ng-init은 특정 경우에 실패했습니다. 문제는 ng-init가 실행될 때 사용중인 값을 아직 사용할 수 없다는 것입니다. 아약스 호출을 통해 값을 얻었고 그 순간 ng-init가 이미 완료되었습니다. 결국 나는 그 가치에 감시자를 사용했고 그 기능에서 나는 ng-init에서했던 것과 똑같이했다. 효과가있었습니다.
maurits

2
나도이 문제를 해결하는 데 문제가 있었으며 @maurits 의견으로 인해이 stackoverflow.com/questions/22348886으로 안내했습니다 .
Michael

5
Angular의 문서에 따르면 이러한 종류의 값을 초기화하기 위해 컨트롤러 $ scope를 더 잘 사용한다고 docs.angularjs.org/api/ng/directive/ngInit
Fortuna

3
경고 :이 목적으로 ng-init를 사용하면 $ digest () 메소드가 과도하게 호출되어 콘솔 출력이 빨간색으로 표시되거나 "10 $ digest () 반복에 도달했습니다. 중단되었습니다!"라는 메시지가 표시됩니다.
DMac Destroyer

235

당신이 확인하려면 반드시 당신의 $scope.somethingHere값이보기에이 초기화, 당신은 (합체 할 것입니다 때 덮어하지 않습니다 somethingHere = somethingHere || options[0].value) 당신의 값과 같이 NG를-초기화하기 :

<select ng-model="somethingHere" 
        ng-init="somethingHere = somethingHere || options[0].value"
        ng-options="option.value as option.name for option in options">
</select>

22
이 솔루션은 잘 작동했으며 선택한 답변보다 낫습니다.
MJ

ng-init는 다음과 같아서는 안됩니다. ng-init = "somethingHere = somethingHere || options [0]"??
infinitloop

1
options비어있는 것을 다루는 방법 ? options데이터가 외부 소스에서 나오는 경우처럼 .
null

1
@ suud는 ng-init에서 options && options.length> 0을 확인하면됩니다. 실제로 대부분의 작업은 컨트롤러에서 수행해야하므로 테스트 할 수 있습니다.
Ben Lesh

@ BenLesh 첫 번째 옵션 대신 텍스트 (문자열)를 쓰려면. ng-init="somethingHere= somethingHere || 'Select one' " 나는 이렇게 시도했다. 그러나 작동하지 않았습니다. 내 코드의
문제점

69

이 시도:

HTML

<select 
    ng-model="selectedOption" 
    ng-options="option.name for option in options">
</select>

자바 스크립트

function Ctrl($scope) {
    $scope.options = [
        {
          name: 'Something Cool',
          value: 'something-cool-value'
        }, 
        {
          name: 'Something Else',
          value: 'something-else-value'
        }
    ];

    $scope.selectedOption = $scope.options[0];
}

Plunker 여기 .

모델에 바인딩 할 값을 실제로 설정하려면 ng-options속성을 로 변경하십시오.

ng-options="option.value as option.name for option in options"

그리고 자바 스크립트

...
$scope.selectedOption = $scope.options[0].value;

또 다른 Plunker는 여기에 위의 고려.


2
문제는 선택 상자를로드 할 때이 작업을 수행해야한다는 것입니다.
iConnor 2009 년

얻지 못했습니다. 어떻게해야합니까?
Michael Benford

아마도 50 개 이상의 선택 상자에 대해 수동으로해야합니다
iConnor

모든 선택 상자의 기본값을 설정하는 것을 의미합니까? 그렇다면 귀하의 질문에 명확하지 않은 것 같습니다. 어쨌든, 모든 선택 상자에 항목을로드해야한다고 가정 할 수 있습니까? 그렇다면 기본값을 초기화하는 것이 큰 문제라고 생각하지 않습니다.
마이클 벤 포드

1
내 문제는 옵션의 색인이 양식의 "제출"에서 반환된다는 것입니다. 내가 필요한 것은 당신이 option.name이라고 부르는 것입니다. ng-repeat를 사용하여 올바른 마크 업을 가져 오므로 확인란과 라디오 버튼이 제대로 작동합니다. 양식 제출시 option.name이 어떻게 반환됩니까?
pferrel

40

하나 개의 Srivathsa Harish Venkataramana 의해 답변을 언급track by 사실이에 대한 해결책이다!

여기에 사용하는 방법 Plunker (아래 링크)와 함께 예입니다 track by에서 선택 ng-options :

<select ng-model="selectedCity"
        ng-options="city as city.name for city in cities track by city.id">
  <option value="">-- Select City --</option>
</select>

경우이 selectedCity각도 범위에 정의하고있다되어 id있는 같은 값으로 속성을 id어떤의 citycities목록은 부하에 선택 자동 수 있습니다.

여기에 Plunker가 있습니다 : http://plnkr.co/edit/1EVs7R20pCffewrG0EmI?p=preview

자세한 내용은 소스 설명서를 참조하십시오 : https://code.angularjs.org/1.3.15/docs/api/ng/directive/select


1
감사합니다.;)
Brahim LAMJAGUAR

1
대박! 감사!
Iurii Golskyi

33

'track by'를 포함시킨 후에는 ng-options에서 다음과 같이 원하는 것을 얻을 수 있다고 생각합니다.

 <select ng-model="somethingHere" ng-options="option.name for option in options track by option.value" ></select>

문자열 목록을 객체 목록으로 바꾸려고 할 때 이것을 다음과 같이 변경하기 때문에 이렇게하는 것이 좋습니다.

 <select ng-model="somethingHere" ng-options="object.name for option in options track by object.id" ></select>

물론 여기에 속성 이름과 ID를 가진 객체가 있습니다. 'as'는 ng-options를 표현하는 이러한 방식으로 사용되지 않습니다. 값을 설정하기 만하고


이것이 나를 위해 일한 것입니다. 앵귤러는 내 범위 모델의 객체를 참조 목록 선택과 동등한 것으로 식별하기 위해 무언가가 필요하다고 생각합니다. "guarantor.code의 트랙"이 트릭을했습니다!
markbaldy

22

수락 된 답변은 ng-init이지만 문서 는 가능한 경우 ng-init를 피하라고 말합니다.

아래 데모에서 볼 수 있듯이 ngInit의 유일한 적절한 사용법은 ngRepeat의 특수 속성에 대한 별칭을 지정하는 것입니다. 이 경우 이외에도 범위에서 값을 초기화하려면 ngInit 대신 컨트롤러를 사용해야합니다.

옵션 ng-repeat 대신에 사용할 수도 있습니다 ng-options. 을 사용하면 특수 속성 과 함께 ng-repeat사용할 수 있습니다 . 즉, $ index, $ odd, $ even로 코딩하지 않고도이 작업을 수행 할 수 있습니다.ng-selectedng-repeat

$first ng-repeat 특수 속성 중 하나입니다.

  <select ng-model="foo">
    <option ng-selected="$first" ng-repeat="(id,value) in myOptions" value="{{id}}">
      {{value}}
    </option>
  </select>

---------------------- 편집 ----------------
이것이 효과가 있지만 @ mik-t를 선호합니다. 당신이 선택할 값이 무엇을 알고있을 때, 대답 https://stackoverflow.com/a/29564802/454252을 하는 용도 track-byng-options사용하지 않고 ng-initng-repeat.

이 답변은 어떤 값을 선택해야할지 몰라도 첫 번째 항목을 선택해야 할 때만 사용해야합니다. 예를 들어, 나는 자동 완성을 위해 이것을 항상 사용하고 있으며 항상 첫 번째 항목을 선택해야합니다.


5
이것은 작동하지만 ng-options보다 빠르고 최적화 된 상태 로 사용해서는 안됩니다 ng-repeat.
Iso

@ 귀하의 의견에 동의하지 않지만 해당 정보의 출처가 있습니까?
Adam Plocher

1
docs.angularjs.org/api/ng/directive/ngOptions “ 문서 에 이해력 표현 <select>select as일부를 통해 모델을 할당 하는 방법에 대한 유연성이 향상되었습니다. ”,“ 반복되는 각 인스턴스”,“ documentFragment개별적으로 옵션을 생성하여 렌더링 속도 향상 ”
Iso

16

내 해결책은 html을 사용하여 기본 옵션을 하드 코딩하는 것이 었습니다. 이렇게 :

HAML에서 :

%select{'ng-model' => 'province', 'ng-options' => "province as province for province in summary.provinces", 'chosen' => "chosen-select", 'data-placeholder' => "BC & ON"}
  %option{:value => "", :selected => "selected"}
    BC &amp; ON

HTML에서 :

<select ng-model="province" ng-options="province as province for province in summary.provinces" chosen="chosen-select" data-placeholder="BC & ON">
  <option value="" selected="selected">BC &amp; ON</option>
</select>

기본 옵션이 내 API의 모든 값을 반환하기를 원하므로 빈 값이 있습니다. 내 실례 할게요 나는 이것이 OP의 질문에 대한 직접적인 대답이 아니라는 것을 알고 있지만 사람들은 이것을 Google에서 찾습니다. 이것이 다른 누군가를 돕기를 바랍니다.


1
이것을 html 로 변환하려고 시도했지만 시도한 모든 온라인 변환기에서 실패했습니다.
iConnor

5
왜 HTML을 게시하지 않습니까? 내 말은, 정말 필요한 코드를 게시하고 있었습니까? OP가 질문에 템플릿 엔진을 사용하는 것과는 다릅니다.
arg20 2016 년

14

아래 코드를 사용하여 모델에서 선택한 옵션을 채우십시오.

<select id="roomForListing" ng-model="selectedRoom.roomName" >

<option ng-repeat="room in roomList" title="{{room.roomName}}" ng-selected="{{room.roomName == selectedRoom.roomName}}" value="{{room.roomName}}">{{room.roomName}}</option>

</select>

나를 위해 일한 lekker. 내 선택 목록에 대한 바인딩 옵션을 담당하는 비동기 호출은 ng-model을 가져온 것보다 약간 느리 므로이 방법으로 많은 도움이되었습니다. 감사합니다 Eebbesen :-)
ajaysinghdav10d

이것은 나에게도 효과적입니다. 간단하고 이해할 수 있습니다.
Kent Aguilar 1

10

사용 가능한 옵션 수에 따라 값을 배열에 넣고 다음과 같이 옵션을 자동으로 채울 수 있습니다.

<select ng-model="somethingHere.values" ng-options="values for values in [5,4,3,2,1]">
   <option value="">Pick a Number</option>
</select>

10

필자의 경우 옵션을 선택하도록 사용자에게 알리기 위해 초기 값을 삽입해야했기 때문에 아래 코드를 좋아합니다.

<select ...
    <option value="" ng-selected="selected">Select one option</option>
</select>

빈 문자열 (null)의 값이! = 인 옵션을 시도했을 때 옵션이 각도로 대체되었지만 (null 값이있는) 이와 같은 옵션을 넣을 때이 옵션이있는 선택 항목이 나타납니다.

나의 나쁜 영어에 의해 미안하다.


8

selectwith 사용 ngOptions및 기본값 설정 :

자세한 사용법 예 는 ngOptions 설명서를 참조하십시오 ngOptions.

angular.module('defaultValueSelect', [])
 .controller('ExampleController', ['$scope', function($scope) {
   $scope.data = {
    availableOptions: [
      {id: '1', name: 'Option A'},
      {id: '2', name: 'Option B'},
      {id: '3', name: 'Option C'}
    ],
    selectedOption: {id: '2', name: 'Option B'} //This sets the default value of the select in the ui
    };
}]);
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.0-rc.0/angular.min.js"></script>
<body ng-app="defaultValueSelect">
  <div ng-controller="ExampleController">
  <form name="myForm">
    <label for="mySelect">Make a choice:</label>
    <select name="mySelect" id="mySelect"
      ng-options="option.name for option in data.availableOptions track by option.id"
      ng-model="data.selectedOption"></select>
  </form>
  <hr>
  <tt>option = {{data.selectedOption}}</tt><br/>
</div>

plnkr.co

SELECT각도 데이터 바인딩을 사용하는 HTML요소에 대한 공식 문서 .

구문 분석 / 형식화 select를 통해 문자열이 아닌 값에 바인딩 ngModel:

(function(angular) {
  'use strict';
angular.module('nonStringSelect', [])
  .run(function($rootScope) {
    $rootScope.model = { id: 2 };
  })
  .directive('convertToNumber', function() {
    return {
      require: 'ngModel',
      link: function(scope, element, attrs, ngModel) {
        ngModel.$parsers.push(function(val) {
          return parseInt(val, 10);
        });
        ngModel.$formatters.push(function(val) {
          return '' + val;
        });
      }
    };
  });
})(window.angular);
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.0-rc.1/angular.min.js"></script>
<body ng-app="nonStringSelect">
  <select ng-model="model.id" convert-to-number>
  <option value="1">One</option>
  <option value="2">Two</option>
  <option value="3">Three</option>
</select>
{{ model }}
</body>

plnkr.co

다른 예 :

angular.module('defaultValueSelect', [])
 .controller('ExampleController', ['$scope', function($scope) {
   $scope.availableOptions = [
     { name: 'Apple', value: 'apple' }, 
     { name: 'Banana', value: 'banana' }, 
     { name: 'Kiwi', value: 'kiwi' }
   ];
   $scope.data = {selectedOption : $scope.availableOptions[1].value};
}]);
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.0-rc.0/angular.min.js"></script>
<body ng-app="defaultValueSelect">
  <div ng-controller="ExampleController">
  <form name="myForm">
    <select ng-model="data.selectedOption" required ng-options="option.value as option.name for option in availableOptions"></select>
  </form>  
  </div>
</body>

jsfiddle


4

이것은 나를 위해 일했습니다.

<select ng-model="somethingHere" ng-init="somethingHere='Cool'">
    <option value="Cool">Something Cool</option>
    <option value="Else">Something Else</option>
</select>

3

제 경우에는 기본값이 양식마다 다르기 때문에. select 태그에 사용자 정의 속성을 추가합니다.

 <select setSeletected="{{data.value}}">
      <option value="value1"> value1....
      <option value="value2"> value2....
       ......

지시문에서 값을 확인하는 스크립트를 작성하고 각도가 값을 채울 때 해당 값을 가진 옵션을 선택된 것으로 설정합니다.

 .directive('setSelected', function(){
    restrict: 'A',
    link: (scope, element, attrs){
     function setSel=(){
     //test if the value is defined if not try again if so run the command
       if (typeof attrs.setSelected=='undefined'){             
         window.setTimeout( function(){setSel()},300) 
       }else{
         element.find('[value="'+attrs.setSelected+'"]').prop('selected',true);          
       }
     }
    }

  setSel()

})

적어도 coffescript에서 이것을 번역했습니다. 적어도 구멍이 아니라면 그것의 jist는 정확합니다.

가장 간단한 방법은 아니지만 값이 다를 때 완료하십시오.


3

에 대한 응답으로 벤 레 쉬는의 대답은 ,이 라인이 있어야한다

ng-init="somethingHere = somethingHere || options[0]" 

대신에

ng-init="somethingHere = somethingHere || options[0].value" 

그건,

<select ng-model="somethingHere"
        ng-init="somethingHere = somethingHere || options[0]"
        ng-options="option.name for option in options track by option.value">
</select>


3

ng-selected="true"다음과 같이 간단히 사용하십시오 .

<select ng-model="myModel">
        <option value="a" ng-selected="true">A</option>
        <option value="b">B</option>
</select>

2

컨트롤러에서 모델을 설정하겠습니다. 그러면 선택이 기본적으로 해당 값으로 설정됩니다. 예 : html :

<select ng-options="..." ng-model="selectedItem">

각도 컨트롤러 (자원 사용) :

myResource.items(function(items){
  $scope.items=items;
  if(items.length>0){
     $scope.selectedItem= items[0];
//if you want the first. Could be from config whatever
  }
});

2

이것은 나를 위해 일하는

ng-selected="true" 

가장 좋은 방법은 ng-initngModel을 설정 하기 때문에 사용 하는 것입니다.
Juanjo Salvador

1

ng-options렌더링 에 사용 하는 경우 optionng-modal과 동일한 값을 갖는 것보다 기본적으로 드롭 다운이 선택됩니다. 예를 고려하십시오.

<select ng-options="list.key as list.name for list in lists track by list.id" ng-model="selectedItem">

따라서 list.key및 값이 같은 옵션 selectedItem이 기본적으로 선택되어 있습니다.


1

선택할 수없는 기본“Please Select”가 필요했습니다. 또한 기본적으로 선택된 옵션을 조건부로 설정할 수 있어야했습니다.

다음과 같은 간단한 방법으로이 작업을 수행했습니다. JS 코드 : //이“2를 뒤집어 기본“선택하십시오”텍스트를 사용하여 선택한 기본값 또는 기본값을 테스트하십시오. //$scope.defaultOption = 0; $ scope.defaultOption = {키 : '3', 값 : '옵션 3'};

$scope.options = [
   { key: '1', value: 'Option 1' },
   { key: '2', value: 'Option 2' },
   { key: '3', value: 'Option 3' },
   { key: '4', value: 'Option 4' }
];

getOptions();

function getOptions(){
    if ($scope.defaultOption != 0)
    { $scope.options.selectedOption = $scope.defaultOption; }
}

HTML :

<select name="OptionSelect" id="OptionSelect" ng-model="options.selectedOption" ng-options="item.value for item in options track by item.key">
<option value="" disabled selected style="display: none;"> -- Please Select -- </option>
</select>
<h1>You selected: {{options.selectedOption.key}}</h1>         

나는 이것이 비슷한 요구 사항을 가진 다른 사람에게 도움이되기를 바랍니다.

"Please Select"는 Joffrey Outtier의 답변을 통해 달성 되었습니다 .


0

날짜 부분을 초기화하는 대신 무언가가있는 경우 ng-init()컨트롤러에서 선언하여 HTML 상단에서 사용할 수 있습니다. 이 함수는 컨트롤러의 생성자처럼 작동하며 여기에서 변수를 시작할 수 있습니다.

angular.module('myApp', [])
 .controller('myController', ['$scope', ($scope) => {
   $scope.allOptions = [
     { name: 'Apple', value: 'apple' }, 
     { name: 'Banana', value: 'banana' }
   ];
   $scope.myInit = () => {
      $scope.userSelected = 'apple'
      // Other initiations can goes here..
   }
}]);


<body ng-app="myApp">
  <div ng-controller="myController" ng-init="init()">
    <select ng-model="userSelected" ng-options="option.value as option.name for option in allOptions"></select>
   </div>
</body>

0
    <!--
    Using following solution you can set initial 
default value at controller as well as after change option selected value shown as default.
    -->
    <script type="text/javascript">
      function myCtrl($scope)
        {
          //...
            $scope.myModel=Initial Default Value; //set default value as required
          //..
        }
    </script>
    <select ng-model="myModel" 
                ng-init="myModel= myModel"
                ng-options="option.value as option.name for option in options">
        </select>

0

각도 컨트롤러에서 이것을 시도하십시오 ...

$ somethingHere = {이름 : '뭔가 멋진'};

값을 설정할 수 있지만 복잡한 유형을 사용하고 각도에서 키 / 값을 검색하여 설정합니다.

작동하지 않는 경우 다음을 시도하십시오. ng-options = "option.value as option.name as option in option track by option.name"


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.