[javascript] AngularJS의 ng 옵션을 사용하여 선택 작업
다른 게시물에서 읽었지만 이해할 수 없었습니다.
배열이 있습니다.
$scope.items = [
{ID: '000001', Title: 'Chicago'},
{ID: '000002', Title: 'New York'},
{ID: '000003', Title: 'Washington'},
];
다음과 같이 렌더링하고 싶습니다.
<select>
<option value="000001">Chicago</option>
<option value="000002">New York</option>
<option value="000003">Washington</option>
</select>
또한 ID = 000002 인 옵션을 선택하고 싶습니다.
나는 select 를 읽고 시도했지만 이해할 수 없다.
답변
ngOptions가 작동 하려면 ngModel이 필요 하다는 점에 주목 해야 합니다. ng-model="blah"
“set $ scope.blah를 선택된 값으로 설정합니다.”
이 시도:
<select ng-model="blah" ng-options="item.ID as item.Title for item in items"></select>
AngularJS의 문서에서 더 많은 내용을 볼 수 있습니다 (보지 못한 경우).
배열 데이터 소스의 경우 :
- 배열의 값 레이블
- 배열의 값 레이블로 선택
- 배열의 값에 대한 그룹 별 레이블 그룹 = 배열의 값에 대한 그룹 별 레이블 그룹으로 선택
객체 데이터 소스의 경우 :
- 객체에서 (key, value)에 대한 레이블
- 객체에서 (key, value) 레이블로 선택
- 객체의 (키, 값)에 대한 그룹 별 레이블 그룹화
- 객체의 (키, 값)에 대해 그룹별로 레이블 그룹으로 선택
AngularJS의 옵션 태그 값에 대한 설명은 다음과 같습니다.
당신이 사용하는 경우 ng-options
, 옵션 태그의 값은 항상 옵션 태그에 관한 배열 항목의 인덱스가됩니다 겨-옵션에 의해 작성 . AngularJS는 실제로 기본 유형뿐만 아니라 선택 컨트롤을 사용하여 전체 객체를 선택할 수 있기 때문입니다. 예를 들면 다음과 같습니다.
app.controller('MainCtrl', function($scope) {
$scope.items = [
{ id: 1, name: 'foo' },
{ id: 2, name: 'bar' },
{ id: 3, name: 'blah' }
];
});
<div ng-controller="MainCtrl">
<select ng-model="selectedItem" ng-options="item as item.name for item in items"></select>
<pre>{{selectedItem | json}}</pre>
</div>
위의 방법으로 전체 객체를 $scope.selectedItem
직접 선택할 수 있습니다. 요점은 AngularJS를 사용하면 옵션 태그에 무엇이 있는지 걱정할 필요가 없다는 것입니다. AngularJS가 처리하도록하십시오. 스코프의 모델에있는 것만 신경 써야합니다.
위의 동작을 보여주고 작성된 HTML을 보여주는 플런저입니다.
기본 옵션 다루기 :
기본 옵션과 관련하여 위에서 언급하지 않은 몇 가지가 있습니다.
첫 번째 옵션을 선택하고 빈 옵션을 제거하십시오.
ng-init
모델을 (에서 ng-model
) 반복하는 항목의 첫 번째 요소로 설정 하는 단순 을 추가하여이를 수행 할 수 있습니다 ng-options
.
<select ng-init="foo = foo || items[0]" ng-model="foo" ng-options="item as item.name for item in items"></select>
참고 : foo
“거짓”으로 올바르게 초기화 되면 약간 미친 듯이 보일 수 있습니다. 이 경우 foo
컨트롤러에서 초기화를 처리하고 싶을 것입니다.
기본 옵션 사용자 정의 :
이것은 조금 다릅니다. 여기서 빈 태그 속성으로 옵션 태그를 선택 항목의 하위 항목으로 추가하고 내부 텍스트를 사용자 정의하기 만하면됩니다.
<select ng-model="foo" ng-options="item as item.name for item in items">
<option value="">Nothing selected</option>
</select>
참고 :이 경우 다른 옵션을 선택한 후에도 “빈”옵션이 그대로 유지됩니다. AngularJS에서 selects의 기본 동작에는 해당되지 않습니다.
선택 후 숨겨지는 사용자 정의 된 기본 옵션 :
값을 선택한 후 사용자 정의 된 기본 옵션을 제거하려면 ng-hide 속성을 기본 옵션에 추가 할 수 있습니다.
<select ng-model="foo" ng-options="item as item.name for item in items">
<option value="" ng-if="foo">Select something to remove me.</option>
</select>
답변
나는 AngularJS를 배우고 있으며 선택에도 어려움을 겪고있었습니다. 나는이 질문에 이미 답변되어 있지만 그럼에도 불구하고 더 많은 코드를 공유하고 싶었습니다.
내 테스트에는 자동차 제조업체와 자동차 모델의 두 가지 목록 상자가 있습니다. 일부 제조업체를 선택할 때까지 모델 목록이 비활성화됩니다. make 목록 상자에서 선택이 나중에 재설정되면 ( ‘make 선택’으로 설정) 모델 목록 상자가 다시 비활성화되고 선택 항목도 재설정됩니다 ( ‘Model 선택’으로). 모델은 단지 하드 코딩 된 동안 Make는 리소스로 검색됩니다.
JSON을 만듭니다.
[
{"code": "0", "name": "Select Make"},
{"code": "1", "name": "Acura"},
{"code": "2", "name": "Audi"}
]
services.js :
angular.module('makeServices', ['ngResource']).
factory('Make', function($resource){
return $resource('makes.json', {}, {
query: {method:'GET', isArray:true}
});
});
HTML 파일 :
<div ng:controller="MakeModelCtrl">
<div>Make</div>
<select id="makeListBox"
ng-model="make.selected"
ng-options="make.code as make.name for make in makes"
ng-change="makeChanged(make.selected)">
</select>
<div>Model</div>
<select id="modelListBox"
ng-disabled="makeNotSelected"
ng-model="model.selected"
ng-options="model.code as model.name for model in models">
</select>
</div>
controllers.js :
function MakeModelCtrl($scope)
{
$scope.makeNotSelected = true;
$scope.make = {selected: "0"};
$scope.makes = Make.query({}, function (makes) {
$scope.make = {selected: makes[0].code};
});
$scope.makeChanged = function(selectedMakeCode) {
$scope.makeNotSelected = !selectedMakeCode;
if ($scope.makeNotSelected)
{
$scope.model = {selected: "0"};
}
};
$scope.models = [
{code:"0", name:"Select Model"},
{code:"1", name:"Model1"},
{code:"2", name:"Model2"}
];
$scope.model = {selected: "0"};
}
답변
어떤 이유로 AngularJS는 나를 혼란스럽게 만듭니다. 그들의 문서는 이것에 꽤 끔찍합니다. 변형의 더 좋은 예를 환영합니다.
어쨌든 벤 레시의 대답에 약간의 차이가 있습니다.
내 데이터 수집은 다음과 같습니다.
items =
[
{ key:"AD",value:"Andorra" }
, { key:"AI",value:"Anguilla" }
, { key:"AO",value:"Angola" }
...etc..
]
지금
<select ng-model="countries" ng-options="item.key as item.value for item in items"></select>
여전히 옵션 값이 인덱스 (0, 1, 2 등)가되었습니다.
트랙 추가 하기 나를 위해 수정했습니다.
<select ng-model="blah" ng-options="item.value for item in items track by item.key"></select>
선택 목록에 객체 배열을 추가하려는 경우가 더 자주 발생하므로이 항목을 기억하겠습니다!
AngularJS 1.4에서는 ng-options를 더 이상 사용할 수 없지만 ng-repeat
옵션 태그 에서 사용해야 합니다.
<select name="test">
<option ng-repeat="item in items" value="{{item.key}}">{{item.value}}</option>
</select>
답변
질문은 이미 답변되었지만 (BTW, Ben이 제공하는 정말 훌륭하고 포괄적 인 답변) 완전성을 위해 다른 요소를 추가하고 싶습니다. 매우 편리 할 수도 있습니다.
Ben이 제안한 예에서 :
<select ng-model="blah" ng-options="item.ID as item.Title for item in items"></select>
다음과 같은 ngOptions 양식이 사용되었습니다 select as label for value in array
.
레이블 은 표현식이며 결과는 <option>
요소 의 레이블입니다 . 이 경우 더 복잡한 옵션 레이블을 갖기 위해 특정 문자열 연결을 수행 할 수 있습니다.
예 :
ng-options="item.ID as item.Title + ' - ' + item.ID for item in items"
당신에게 같은 레이블을 제공합니다Title - ID
ng-options="item.ID as item.Title + ' (' + item.Title.length + ')' for item in items"
같은 당신이 레이블을 제공Title (X)
하는 경우,X
제목 문자열의 길이입니다.
예를 들어 필터를 사용할 수도 있습니다.
ng-options="item.ID as item.Title + ' (' + (item.Title | uppercase) + ')' for item in items"
Title (TITLE)
Title 속성의 Title 값과 TITLE은 같은 값이지만 대문자로 변환되는 것과 같은 레이블을 제공합니다 .ng-options="item.ID as item.Title + ' (' + (item.SomeDate | date) + ')' for item in items"
Title (27 Sep 2015)
모델에 속성이있는 경우 와 같은 레이블을 제공합니다.SomeDate
답변
CoffeeScript에서 :
#directive
app.directive('select2', ->
templateUrl: 'partials/select.html'
restrict: 'E'
transclude: 1
replace: 1
scope:
options: '='
model: '='
link: (scope, el, atr)->
el.bind 'change', ->
console.log this.value
scope.model = parseInt(this.value)
console.log scope
scope.$apply()
)
<!-- HTML partial -->
<select>
<option ng-repeat='o in options'
value='{{$index}}' ng-bind='o'></option>
</select>
<!-- HTML usage -->
<select2 options='mnuOffline' model='offlinePage.toggle' ></select2>
<!-- Conclusion -->
<p>Sometimes it's much easier to create your own directive...</p>
답변
각 옵션에 대한 사용자 지정 제목이 필요한 경우 ng-options
해당 사항이 없습니다. 대신 ng-repeat
옵션과 함께 사용하십시오 .
<select ng-model="myVariable">
<option ng-repeat="item in items"
value="{{item.ID}}"
title="Custom title: {{item.Title}} [{{item.ID}}]">
{{item.Title}}
</option>
</select>
답변
다음이 도움이 되길 바랍니다.
<select class="form-control"
ng-model="selectedOption"
ng-options="option.name + ' (' + (option.price | currency:'USD$') + ')' for option in options">
</select>