AngularJS가 선택시 빈 옵션을 포함하는 이유는 무엇입니까?


652

나는 지난 몇 주 동안 AngularJS와 함께 일해 왔으며 실제로 나를 괴롭히는 것은 http://docs.angularjs.org/api/ng 의 사양에 정의 된 모든 순열이나 구성을 시도한 후에도 .directive : select , 여전히 select 요소의 첫 번째 자식으로 빈 옵션이 표시됩니다.

여기 옥이 있습니다 :

select.span9(ng-model='form.type', required, ng-options='option.value as option.name for option in typeOptions');

여기 컨트롤러가 있습니다 :

$scope.typeOptions = [
    { name: 'Feature', value: 'feature' },
    { name: 'Bug', value: 'bug' },
    { name: 'Enhancement', value: 'enhancement' }
];

마지막으로 생성되는 HTML은 다음과 같습니다.

<select ng-model="form.type" required="required" ng-options="option.value as option.name for option in typeOptions" class="span9 ng-pristine ng-invalid ng-invalid-required">
    <option value="?" selected="selected"></option>
    <option value="0">Feature</option>
    <option value="1">Bug</option>
    <option value="2">Enhancement</option>
</select>

그것을 없애려면 어떻게해야합니까?

추신 : 이것도없이 작동하지만 다중 선택없이 select2를 사용하면 이상하게 보입니다.

답변:


646

option의해 참조 된 값 ng-model이에 전달 된 옵션 세트에 존재하지 않으면 비어 있습니다 ng-options. 우발적 인 모델 선택을 방지하기 위해 발생합니다. AngularJS는 초기 모델이 정의되지 않았거나 옵션 세트에 있지 않고 모델 값을 스스로 결정하고 싶지 않다는 것을 알 수 있습니다.

빈 옵션을 제거하려면 컨트롤러에서 초기 값을 선택하십시오.

$scope.form.type = $scope.typeOptions[0].value;

다음은 jsFiddle입니다. http://jsfiddle.net/MTfRD/3/

즉, 빈 옵션은 유효한 모델이 선택되지 않았 음을 의미합니다 (유효한 옵션은 옵션 세트에서). 이 빈 옵션을 제거하려면 유효한 모델 값을 선택해야합니다.


7
나는 $ scope.form.type = ''; $ scope.form.type = $ scope.typeOptions [0], 그러나 여전히이 옵션은 <option value = "?"입니다. selected = "selected"> </ option>
Sudhanshu

5
때로는이 데이터를 JS에 포함시키는 것이 의미가 없습니다. 선택한 서버에 대한 결정을 내린 서버 인 경우 JS가 왜이를 복제해야합니까?
heneryville 2013

11
불행히도 배열을 사용하고 null있고 값 중 하나 인 경우 작동하지 않습니다 .
vpiTriumph

6
빈 안에 텍스트를 추가하여 <option>각도가 다음과 같이 생성 될 수 있습니까?<option value="?">Select an option</option>
RPDeshaies

3
@ Tareck117은 옵션 목록 <option value="">Select an option</option>의 null 값입니다. ? 문자가 필요 없습니다.
Sebastian

235

초기 값을 원하면 @ pkozlowski.opensource의 답변을 참조하십시오.이 FYI는 ng-init를 사용하여 (컨트롤러가 아닌) 뷰에서 구현할 수도 있습니다.

<select ng-model="form.type" required="required" ng-init="form.type='bug'"
  ng-options="option.value as option.name for option in typeOptions" >
</select>

초기 값을 원하지 않으면 "값이 빈 문자열로 설정된 하드 코딩 된 단일 요소를 요소에 중첩 할 수 있습니다.이 요소는 null 또는"선택되지 않음 "옵션을 나타냅니다."

<select ng-model="form.type" required="required"
  ng-options="option.value as option.name for option in typeOptions" >
    <option style="display:none" value="">select a type</option>
</select>

4
@hugo, working fiddle : jsfiddle.net/4qKyx/1 "유형 선택"이 표시되지만 이와 관련된 값은 없습니다. 그리고 다른 것을 선택하면 다시 볼 수 없습니다. (Chrome에서 테스트)
Mark Rajcok

1
@MarkRajcok-훌륭한 제안! 나는 지시문을 번역하는 예제를 사용하여 다른 문제를 발견했습니다. 좀 봐 주실 래요? plnkr.co/edit/efaZdEQlNfoDihk1R1zc?p= 미리보기
Jan-Terje Sørensen

2
이것으로 문제는 여전히 키보드로 선택할 수 있다는 것입니다. stackoverflow.com/a/8442831/57344 솔루션
HaveAGuess

2
이것은 현재로서는 효과가있을 수 있지만, 앵귤러 문서는 ng-repeat 이외의 다른 것에 ng-init를 사용하지 말 것을 권장합니다 -docs.angularjs.org/api/ng/directive/ngInit
Ed Norris

3
IE10에서 작동하지 않으면 "유형 선택"이 항상 표시되고 선택 가능합니다.
Robin

121

각도 <1.4

"null"을 옵션 중 하나에 대한 유효한 값으로 취급하는 사람은 "null"이 아래 예의 typeOptions 항목 중 하나의 값이라고 가정 하면 자동으로 추가되도록하는 가장 간단한 방법을 찾았습니다. 옵션은 ng-if를 사용하는 것입니다.

<select ng-options="option.value as option.name for option in typeOptions">
    <option value="" ng-if="false"></option>
</select>

ng-if 이고 ng-hide가 아닌가? 위의 첫 번째 옵션을 대상으로하는 CSS 선택기가 숨겨져있는 것이 아니라 "실제"옵션을 대상으로 선택하기를 원하기 때문입니다. e2e 테스트에 각도기를 사용하고 어떤 이유로 든 선택 옵션을 대상으로 by.css ()를 사용하면 유용합니다.

각도> = 1.4

select 및 options 지시문의 리팩토링으로 인해 using ng-if은 더 이상 실행 가능한 옵션이 아니므로 ng-show="false"다시 사용하도록 설정해야합니다.


5
선택에 대한 올바른 시각적 동작이므로 허용되는 답변이어야합니다. 당신은 넣어 size="5"선택 속성에 당신은 아무것도 선택되어 있지 않은 것을 볼 수 있습니다! 기본 <select>요소 처럼 ! 나는 왜 각도가 multiple속성이 없는 선택에 대해 그런 일을하는지 이해할 수 없습니다 ...
Sebastian

1
예, 동의합니다. 수락 된 답변이어야합니다. 이것이 '각도'입니다. ng-if는 실제로 dom에서 옵션 요소를 제거하므로 (false 인 경우)이 솔루션은 'ngy hide'또는 ng-show와 달리 'hacky'코딩없이 모든 브라우저에서 작동합니다.
Sander_P

2
@Sander_P 정의에 따르면이 솔루션은 내 생각에 "해키"코딩입니다 (각도를 속이려고 속임수를 쓰는 것). 그러나 여전히 "최상의"솔루션입니다. "더 나은"솔루션은 가치가없는 friggin select를 허용하는 것입니다! 이런 젠장? 이것이 엣지 시나리오는 아닙니다.
dudewad

@dudewad : Angular 1.4에서 더 잘 작동 할 수 있습니다. 1.4.0 용 AngularJS 블로그에서 : "ngOptions는 여러 가지 성가신 버그를 수정하기 위해 완전히 리팩토링되었습니다."
Sander_P

1
하하 "성가신 버그". 괜찮아. 글쎄, 나는 배달 3 일 전에 업그레이드 할 때 여전히 약간 어리 석다. 그래서 나는 당신의 솔루션을 계속 유지할 것입니다. 그러나 미래에 주목 :) 감사합니다!
dudewad

36

누군가에게 유용 할 수 있습니다.

ng-options 대신 일반 옵션을 사용하려면 다음과 같이하십시오.

<select ng-model="sortorder" ng-init="sortorder='publish_date'">
  <option value="publish_date">Ascending</option>
  <option value="-publish_date">Descending</option>
</select>

모델을 인라인으로 설정하십시오. ng-init를 사용하여 빈 옵션을 제거하십시오.


JSON 배열이 아닌 OBJECTS를 사용하여 ng-options를 설정하는 명확한 예를 찾을 수 없었으며 둘 사이의 "번역"을 시도 할 때 제대로 나오지 않을뿐만 아니라 "자동으로"실패합니다. 나는 내가 뭘 잘못하고 있는지 전혀 모른다. 나는 옵션 태그에서 일반 ng-repeat를 선택했습니다. 나는 그것이 모범 사례는 아니지만 적어도 효과가 있다는 것을 알고 있습니다. 누구든지 데이터 객체 (JSON이 아닌)와 ng 옵션을 사용하는 각도-n00b 친화적 인 WORKING 예제를 간단하고 쉽게 바꿀 수 있다고 지적한다면 기뻐할 것입니다. ng-init도 사용하면 Double Elated입니다.
code-sushi

일반 옵션을 사용하고 있지만 컨트롤러에서 선택한 드롭 다운 값을 얻지 못하는 것 같습니다. 예 : 나는 alert ($ scope.sortorder.value); 및 alert ($ scope.sortorder); 둘 다 정의되지 않습니다. 여기서 선택한 값을 얻는 방법은 무엇입니까?
Maverick Riz

정말 감사합니다. 컨트롤러에서 완전히 쓸모없는 객체를 쓰려고했지만, 간단한 선택 만하면됩니다. 다시 한 번 감사드립니다.
Muhammad bin Yusrat

22

비슷한 일이 나에게 일어나고 있었고 각도 1.5로 업그레이드했기 때문에 발생했습니다. 최신 버전의 Angular에서 유형ng-init대해 구문 분석되는 것 같습니다 . 이전 Angular에서는 값이 "600"인 옵션에 매핑 되지만 Angular 1.5에서는 값이 600 인 옵션을 찾을 것으로 예상되므로이를 찾지 못합니다 . 그러면 Angular는 임의의 첫 번째 항목을 삽입합니다.ng-init="myModelName=600"<option value="600">First</option><option value=600>First</option>

<option value="? number:600 ?"></option>

각도 <1.2.x

<select ng-model="myModelName" ng-init="myModelName=600">
  <option value="600">First</option>
  <option value="700">Second</option>
</select>

각도> 1.2

<select ng-model="myModelName" ng-init="myModelName='600'">
  <option value="600">First</option>
  <option value="700">Second</option>
</select>

1
감사! 제 경우에는 ng-init (기본값 없음)를 사용할 수 없으므로 모델을 문자열로 캐스팅하여 작동했습니다!
Rodrigo Graça

내 응용 프로그램 제작 문제에 매우 유용합니다. 감사합니다 @Nabil 보그
Venki

3
이것은 확실히 작동하지만 더 나은 옵션은 대신에 사용 ng-value="600"하는 option것입니다 value. 그것은 숫자로 구문 분석하고 지금처럼 값을 변환 할 필요가 없습니다 :)
Max

@ Max 나는 많은 가치있는 답변을 시도했지만 당신을 찾을 때까지 아무것도 작동하지 않았습니다. 감사합니다.
Andrew

21

여기에 여러 답변 중, 나는 나를 위해 일한 솔루션을 다시 게시 하고 다음 조건을 모두 충족시킬 것이라고 생각했습니다 .

  • ng-model이 잘못된 경우 자리 표시 자 / 프롬프트 제공 (예 : "--select region --"w.value="" )
  • ng-model 값이 잘못된 경우 이고 사용자가 옵션 드롭 다운을 열면 자리 표시자가 선택됩니다 (여기에 언급 된 다른 솔루션은 오해의 소지가있는 첫 번째 옵션이 선택된 것으로 나타남)
  • 사용자가 유효한 값을 선택 취소 할 수 있도록합니다. 기본적으로 거짓 / 기본값을 다시 선택 합니다.

여기에 이미지 설명을 입력하십시오

암호

<select name="market_vertical" ng-model="vc.viewData.market_vertical"
    ng-options="opt as (opt | capitalizeFirst) for opt in vc.adminData.regions">

    <option ng-selected="true" value="">select a market vertical</option>
</select>

src

오리지널 Q & A- https : //stackoverflow.com/a/32880941/1121919


기본값이 <option ng-selected="true" value="null">입니까?
jusopi

ng-model 값이 null로 설정되면 선택에서 각도 생성 및 빈 옵션
Flezcano

16

빠른 해결책 :

select option:empty { display:none }

그것이 누군가를 돕기를 바랍니다. 이상적으로는 선택된 답변이 접근 방식이어야하지만 불가능한 경우에는 패치로 작동해야합니다.


2
내 테스트에 따르면 Chrome (새로운 Chrome)과 Firefox에서만 작동합니다. IE와 Safari가 중단됩니다. 오페라와 다른 엣지 브라우저에 대해 모른다. 어느 쪽이든 , 불행히도 이것은 좋은 해결책 이 아닙니다 .
dudewad

<select>를 닫기 전에 html 또는 js에서 어디에 배치해야합니까
H Varma

1
@HVarma CSS 규칙입니다. 스타일 시트 또는 <style> 태그 안에 배치
KK

@KK stackoverflow.com/questions/48355599/… 이것을 확인할 수 있습니까?
Sudarshan Kalebere

14

예 ng-model 속성이 정의되지 않은 경우 ng-model은 빈 옵션 값을 만듭니다. ng-model에 객체를 할당하면 이것을 피할 수 있습니다

각도 코딩

$scope.collections = [
    { name: 'Feature', value: 'feature' }, 
    { name: 'Bug', value: 'bug' }, 
    { name: 'Enhancement', value: 'enhancement'}
];

$scope.selectedOption = $scope.collections[0];


<select class='form-control' data-ng-model='selectedOption' data-ng-options='item as item.name for item in collections'></select>

중요 사항:

$ scope.collections [0] 또는 $ scope.collections [1]과 같은 배열의 객체를 ng-model에 할당합니다. 객체 속성은 사용하지 마십시오. 콜백 기능을 사용하여 서버에서 옵션 값을 선택하는 경우 ng-model에 객체를 할당하십시오.

각도 문서의 참고 사항

참고 : ngModel은 값이 아니라 참조로 비교합니다. 이것은 객체 배열에 바인딩 할 때 중요합니다. 예를 참조하십시오 http://jsfiddle.net/qWzTb/

나는 마침내 그것을 많이 찾았다.


8

@ pkozlowski.opensource 's 및 @ Mark 's 답변이 모두 정확하지만 값에 관계없이 항상 목록의 첫 번째 항목을 선택하는 약간 수정 된 버전을 공유하고 싶습니다.

<select ng-options="option.value as option.name for option in typeOptions" ng-init="form.type=typeOptions[0].value">
</select>

4

Angular 1.4x를 사용하고 있으며이 예제를 찾았으므로 ng-init를 사용하여 select의 초기 값을 설정했습니다.

<select ng-init="foo = foo || items[0]" ng-model="foo" ng-options="item as item.id for item in items"></select>

3


나는 같은 문제에 직면했다. 일반 게시물로 각도 양식을 게시하는 경우 각도를 사용하면 옵션을 사용하는 방식으로 옵션 값을 설정할 수 없으므로이 문제가 발생합니다. "form.type"값을 얻으면 올바른 값을 찾을 수 있습니다. 각도 개체는 폼 포스트가 아닌 자체 게시해야합니다.


3

간단한 해결책은 빈 값으로 옵션을 설정하는 ""것이므로 추가 정의되지 않은 옵션이 제거됩니다.


5
Doenst work @ 1.4.3, 단지 2 개의 빈 옵션을 양식에 추가합니다
Denny Mueller

3

실제로 대답은 간단합니다. Angular가 인식하지 못하는 옵션이 있으면 둔한 옵션이 포함됩니다. 당신이 잘못하고있는 것은 ng-options를 사용할 때 객체를 읽습니다.[{ id: 10, name: test }, { id: 11, name: test2 }] right?

선택한 값을 10으로 설정하고 모델을 { id: 10, name: test }10을 선택 하는 것과 같은 값으로 설정해야 하므로 휴지통을 만들지 않습니다.

그것이 모두가 이해하는 데 도움이되기를 바랍니다. 나는 힘든 시간을 보냈습니다 :)


2

이 솔루션은 저에게 효과적입니다.

<select ng-model="mymodel">    
   <option ng-value="''" style="display:none;" selected>Country</option>
   <option value="US">USA</option>
</select>

Downvote는 옵션 요소에 CSS를 적용하는 것이 모든 브라우저에서 작동하지 않기 때문일 수 있습니다.
Kafoso

방금 Chrome, FireFox, Safari 및 Edge에서 테스트했습니다. 모든 것이 작동합니다.
MMM

@MMM "모든 브라우저"에는 IE가 포함됩니다. 많은 사용자들이 여전히 IE 10과 11을 고수하고 있으며 이것이 다운 보트가 발생한 이유 일 것입니다. Chrome, fF, Saf 및 Edge는 "모든 브라우저"가 아닙니다.
PKD

1

이것은 나를 위해 일했다

<select ng-init="basicProfile.casteId" ng-model="basicProfile.casteId" class="form-control">
     <option value="0">Select Caste....</option>
     <option data-ng-repeat="option in formCastes" value="{{option.id}}">{{option.casteName}}</option>
 </select>

옵션을 목록에 추가하고 슬프게도 빈 공간을 남겨 둡니다.
AMontpetit

1

이것은 완벽하게 작동합니다

<select ng-model="contact.Title" ng-options="co for co in['Mr.','Ms.','Mrs.','Dr.','Prof.']">
    <option style="display:none" value=""></option>
</select>

작동 방식은 무언가를 선택하기 전에 첫 번째로 표시되는 옵션을 제공하고 display:none제거하려면 드롭 다운 에서 제거하므로 원하는 경우 수행 할 수 있습니다

<select ng-model="contact.Title" ng-options="co for co in['Mr.','Ms.','Mrs.','Dr.','Prof.']">
    <option style="display:none" value="">select an option...</option>
</select>

그러면 select and option선택하기 전에 선택하지만 한 번 선택하면 사라지고 드롭 다운에 표시되지 않습니다.


실제로 당신은 질문 자체에 대답하지 않고 그보다 최악의 경우 요소를 숨기고 있습니다.
Marco

0

동일한 순서로 컨트롤러에서 이것을 시도하십시오.

$scope.typeOptions = [
    { name: 'Feature', value: 'feature' }, 
    { name: 'Bug', value: 'bug' }, 
    { name: 'Enhancement', value: 'enhancement' }
];
$scope.form.type = $scope.typeOptions[0];

나는 당신의 방법을 시도했지만 불행히도 나는 그것을 작동시키지 못했습니다. 이 바이올린을 볼 수 있습니까? jsfiddle.net/5PdaX
Aniket Sinha

0

수정 사항은 다음과 같습니다.

다음과 같은 샘플 데이터

financeRef.pageCount = [{listCount:10,listName:modelStrings.COMMON_TEN_PAGE},    
{listCount:25,listName:modelStrings.COMMON_TWENTYFIVE_PAGE},
{listCount:50,listName:modelStrings.COMMON_FIFTY_PAGE}];

선택 옵션은 다음과 같아야합니다.

<select ng-model="financeRef.financeLimit" ng-change="financeRef.updateRecords(1)" 
class="perPageCount" ng-show="financeRef.showTable" ng-init="financeRef.financeLimit=10"
ng-options="value.listCount as value.listName for  value in financeRef.pageCount"
></select>

우리가 쓸 때되는 점 value.listCount으로는 value.listName, 그것은 자동으로 텍스트를 채 웁니다 value.listName하지만 선택된 옵션의 값입니다value.listCount 값이 0, 정상 .. 등등 표시의 나 있지만!

내 경우에는 financeRef.financeLimit실제로을 잡고 value.listCount컨트롤러에서 동적으로 조작 할 수 있습니다.


0

초기 값이 일부 부모 요소 또는 1.5 구성 요소의 바인딩에서 오는 경우 적절한 유형이 전달되는지 확인하고 싶습니다. @바인딩에 사용 하는 경우 전달 된 변수는 문자열이며 옵션이 예입니다. 정수이면 빈 옵션이 나타납니다.

init의 값을 올바르게 구문 분석하거나 바인딩 <하지 않고 바인딩하십시오 @(필요하지 않은 경우 성능에 권장 되지 않음 ).


0

간단한 솔루션

<select ng-model='form.type' required><options>
<option ng-repeat="tp in typeOptions" ng-selected="    
{{form.type==tp.value?true:false}}" value="{{tp.value}}">{{tp.name}}</option>


0

옵션을 제어하지 않을 때 jQuery를 사용하는 솔루션

html :

<select id="selector" ng-select="selector" data-ng-init=init() >
...
</select>

js :

$scope.init = function () {
    jQuery('#selector option:first').remove();
    $scope.selector=jQuery('#selector option:first').val();
}

이것은 jQuery를 솔루션이기 때문에 파스칼, 누군가가 당신을을 downvoted하지 AngularJS와
Mawg는 분석 재개 모니카 말한다

문제는 더 많은 각도를 발굴하도록 요청 받았다 ... :-/
Sahu V Kumar

0

이 문제를 해결하기 위해 ng-init 모델을 사용하는 경우 :

<select ng-model="foo" ng-app ng-init="foo='2'">

0

나는 같은 문제가 있었다. 나는 ( "ng-model"을 제거했다) 이것을 바꾸었다.

<select ng-model="mapayear" id="mapayear" name="mapayear" style="  display:inline-block !important;  max-width: 20%;" class="form-control">
  <option id="removable" hidden> Selecione u </option>
    <option selected ng-repeat="x in anos" value="{{ x.ano }}">{{ x.ano }}
</option>
</select>

이에:

<select id="mapayear" name="mapayear" style="  display:inline-block !important;  max-width: 20%;" class="form-control">
  <option id="removable" hidden> Selecione u </option>
    <option selected ng-repeat="x in anos" value="{{ x.ano }}">{{ x.ano }}
</option>
</select>

이제는 작동하지만 제 경우에는 ng.controller에서 해당 범위를 삭제했기 때문에 u가 동일하지 않은지 확인하십시오.



0

나를 위해 일한 유일한 것은 track by에서 다음 ng-options과 같이 사용하는 것입니다 .

 <select class="dropdown" ng-model="selectedUserTable" ng-options="option.Id as option.Name for option in userTables track by option.Id">


내가 사용하는 경우이 ng-option내가의 설정 값에 원하는 배열의 마지막 값을 얻을 option의를 select. 그것은 해결되지 않았다 :(
rufatZZ

0

이 문제를 극복하는 방법은 angularjs 문서의 예제를 참조하십시오.

  1. 이 문서 링크로 이동 하십시오
  2. 찾기 ' ngModel 구문 분석을 통해 비 문자열 값을 선택 바인딩 / 서식 '
  3. 거기에서 ' convertToNumber ' 라는 지시문 이 문제를 해결한다는 것을 알 수 있습니다 .

그것은 나를 위해 작동합니다. 여기에서 어떻게 작동하는지 볼 수 있습니다


0

CSS를 사용하여 첫 번째 옵션을 숨길 수는 있지만 IE 10, 11에서는 작동하지 않습니다. 가장 좋은 방법은 Jquery를 사용하여 요소를 제거하는 것입니다. 이 솔루션은 Chrome 및 IE10,11에서 테스트 된 주요 브라우저에서 작동합니다.

또한 angular를 사용하는 경우 setTimeout을 사용하는 경우가 있습니다.

$scope.RemoveFirstOptionElement = function (element) {
    setTimeout(function () {
        $(element.children()[0]).remove();
    }, 0);
};
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.