ng-optionを使用してselect要素のデフォルト値を設定する方法


148

Angular selectディレクティブのドキュメントは、http//docs.angularjs.org/api/ng.directive:selectで確認しました。デフォルト値の設定方法がわかりません。これは紛らわしいです:

配列の値のラベルとして選択

ここにオブジェクトがあります:

{
    "type": "select", 
    "name": "Service",
    "value": "Service 3", 
    "values": [ "Service 1", "Service 2", "Service 3", "Service 4"] 
}

html(動作中):

<select><option ng-repeat="value in prop.values">{{value}}</option></select>

次に、select要素内にng-option属性を追加しprop.valueて、デフォルトオプションとして設定しようとしています(機能していません)。

ng-options="(prop.value) for v in prop.values"

何が悪いのですか?

回答:


131

したがって、オブジェクトがスコープ内にあると想定します。

<div ng-controller="MyCtrl">
  <select ng-model="prop.value" ng-options="v for v in prop.values">
  </select>
</div>

 

function MyCtrl($scope) {
  $scope.prop = {
    "type": "select", 
    "name": "Service",
    "value": "Service 3", 
    "values": [ "Service 1", "Service 2", "Service 3", "Service 4"] 
  };
}

働くPlunkr:http ://plnkr.co/edit/wTRXZYEPrZJRizEltQ2g


2
はい、分かりました!これng-option<option ng-repeat="value in prop.values">{{value}}</option>再び感謝の代わりです
フランソワロマン2013年

2
これを行うにはもっと簡単な方法が必要です。角度jsで単純なデフォルト値を選択する場合、これは非常に複雑です
Edmund Rojas

1
ng-optionディレクティブは、構文がやや複雑で混乱を招きます。オブジェクトをバインドする柔軟性により、少し複雑になったと思います。これを思い出そうとする方法は、オブジェクトを使用するときは常に、selectコントロールの値/テキスト属性に使用するプロパティを明示的に示すことです。詳細については、こちらをご覧ください: ozkary.com/2015/08/angularjs-ngoption-directive-simplified.html
ozkary

2
オプションを<select ng-model="limit" value="10" ng-options="v for v in [5,10,15,20,30,50]"></select>
書き出さ

1
@james Kleeh ..ここでは、最初のオプションがわかっているため、最初のオプションをハードコーディングしていますが、オプションがわからない場合、デフォルトで最初のオプションをどのように表示できますか?
H Varma 2016年

69

選択のための角度のドキュメント *は、明示的にこの質問に答えていないが、それはそこにあります。を見るとscript.js、次のことがわかります。

function MyCntrl($scope) {
  $scope.colors = [
    {name:'black', shade:'dark'},
    {name:'white', shade:'light'},
    {name:'red', shade:'dark'},
    {name:'blue', shade:'dark'},
    {name:'yellow', shade:'light'}
  ];
  $scope.color = $scope.colors[2]; // Default the color to red
}

これはhtmlです:

<select ng-model="color" ng-options="c.name for c in colors"></select>

これは<select>withで選択された値をデフォルトにするより明白な方法のようですng-options。また、ラベル/値が異なる場合にも機能します。

* これはAngular 1.2.7からのものです


これは私にとってはうまくいきました、私はこれが再び現れるとは思えませんが、誰かがこれを見つけて互換性について疑問に思っている場合に備えて、現在AngularJS v1.2.27を使用しています。
Robert

41

この回答は、DBからデータを取り込み、変更を加えた後、変更を永続化する場合により役立ちます。

 <select  ng-options="opt.id as opt.name for opt in users" ng-model="selectedUser"></select>

ここで例を確認してください:

http://plnkr.co/edit/HrT5vUMJOtP9esGngbIV


最後に、ここで有効な答え、賛成票を投じました!また、このソリューションでは、未定義のオプションを適切に機能させることができます。<option value = "">選択してください</ option>
DDD

この投稿が存在してうれしいので、私はしばらくの間解決策を探していましたが、この解決策で問題が解決しました。
slee423 2018年

22
<select name='partyid' id="partyid" class='span3'>
<option value=''>Select Party</option>
<option ng-repeat="item in partyName" value="{{item._id}}" ng-selected="obj.partyname == item.partyname">{{item.partyname}}
</option>
</select>

5
ここに悪い習慣があります... 2番目の黄色いメモを見てください:docs.angularjs.org/api/ng/directive/select
M'sieur Toph '

これは機能しません、例えば。レコードを編集しようとすると、レコードはどのようにフィールドにバインドされますか?
windmaomao 2015

21

オブジェクトの配列が次のように複雑な場合:

$scope.friends = [{ name: John , uuid: 1234}, {name: Joe, uuid, 5678}];

そしてあなたの現在のモデルは次のようなものに設定されました:

$scope.user.friend = {name:John, uuid: 1234};

track byng-model = "user.friend"にもuuidがある限り、uuid(または一意のフィールド)で関数を使用するのに役立ちました。

<select ng-model="user.friend" 
ng-options="friend as friend.name for friend in friends track by friend.uuid"> 
</select>

この答えは私の一日を作りました!また、このドキュメントのトラックバイもご覧ください
Arashsoft

これが一番の答えです!
Gerfried 2017

10

私はこれに数時間苦労したので、いくつかの説明を付け加えたいと思います。ここに記載されているすべての例は、サービスやデータベースからではなく、スクリプト自体からデータが読み込まれる場合を示しています。だから私と同じ問題を抱えている人に私の経験を提供したいと思います。

通常は、目的のオプションのIDのみをデータベースに保存するので、それを表示しましょう

service.js

myApp.factory('Models', function($http) {
var models = {};
models.allModels = function(options) {
    return $http.post(url_service, {options: options});
};

return models;
});

controller.js

myApp.controller('exampleController', function($scope, Models) {
$scope.mainObj={id_main: 1, id_model: 101};
$scope.selected_model = $scope.mainObj.id_model;
Models.allModels({}).success(function(data) {
    $scope.models = data; 
});
});

最後に、部分的なhtml model.html

Model: <select ng-model="selected_model" 
ng-options="model.id_model as model.name for model in models" ></select>

基本的に私は一枚「というポイントに望んでいたモデルでモデルのmodel.nameとしてmodel.id_model」「model.id_modelは、あなたが」と一致させることができますように、「値のためのモデルのIDを使用していますmainObj.id_modelもあります」 「selected_model」、これは単なる値です。「as model.name」はリピーターのラベルです。最後に、「model in models」は、私たちが知っている通常のサイクルです。

これが誰かを助けることを願っています、そしてそれが役立つ場合は投票してください:D


1
'placeholder / plain value'変数を使用する代わりに、selectをmainObj.id_model直接(ng-model="mainObj.id_model")にバインドすることができますselected_model
drzaus

はい、確かに、私は$ scope内の値で直接実行できることを示したかっただけですが、指摘してくれてありがとう。
Wiston Coronell 2014

intだけでなくオブジェクトにバインドすることは可能ですか?選択した項目を設定するためにnGoptionsを取得できません。これは、{id:24}を[{id:23}、{id:24}、{id:25}]にバインドする方法がわからないためです。
Victorio Berra 2015

常に$ indexを使用して位置を取得できますが、オブジェクトにバインドすることは可能です
Wiston Coronell

10
<select id="itemDescFormId" name="itemDescFormId" size="1" ng-model="prop" ng-change="update()">
    <option value="">English(EN)</option>
    <option value="23">Corsican(CO)</option>
    <option value="43">French(FR)</option>
    <option value="16">German(GR)</option>

空の値を持つオプションを追加するだけです。それが動作します。

デモプランカー


次のようなものを追加すると、実際に機能します<option value="" disabled>Please Select</option>
fWd82

9

それを行う簡単な方法は、 data-ng-init

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

ここでの主な違いは、含める必要があるということです data-ng-model


3
ドキュメントで指定されているように:ngInitの唯一の適切な使用は、以下のデモで見られるように、ngRepeatの特別なプロパティをエイリアスすることです。この場合のほかに、スコープの値を初期化するには、ngInitではなくコントローラーを使用する必要があります。
user12121234 2015

1
ng-optionsを使用して投稿した方法は、はるかに簡単で具体的です。どちらの方法でも機能します。
Wyetro 2015

3

NG-モデルの属性が選択されたオプションを設定しても、あなたはパイプにのようなフィルタできますORDERBY:orderModel.valueを

index.html

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

controllers.js

$scope.orderOptions = [
    {"name":"Newest","value":"age"},
    {"name":"Alphabetical","value":"name"}
];

$scope.orderModel = $scope.orderOptions[0];

1
これを試してみるとわかりangular.js:117 TypeError: a.forEach is not a functionます。何かご意見は?
カルメニズム

1

Chrome、IE 10/11、Firefoxのページに時々データが入力されないデフォルト値が実行されている場合は、この属性を入力/選択フィールドに追加して、HTMLの入力された変数をチェックします。

<input data-ng-model="vm.x" data-ng-if="vm.x !== '' && vm.x !== undefined && vm.x !== null" />

0

数値IDを使用してオプションのインデックスを作成する必要がない場合は、本当に簡単です。

  1. $ scope var-people配列を宣言します

    $scope.people= ["", "YOU", "ME"];
  2. 上記のスコープのDOMで、オブジェクトを作成します

    <select ng-model="hired" ng-options = "who for who in people"></select>
  3. コントローラーで、ngモデルを「採用」に設定します。

    $scope.hired = "ME";

幸運を!!!とても簡単です!


0

足し算するために、私はこのようなことをしました。

 <select class="form-control" data-ng-model="itemSelect" ng-change="selectedTemplate(itemSelect)" autofocus>
        <option value="undefined" [selected]="itemSelect.Name == undefined" disabled="disabled">Select template...</option>
        <option ng-repeat="itemSelect in templateLists" value="{{itemSelect.ID}}">{{itemSelect.Name}}</option></select>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.