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.