[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>