単純な配列initを持つng-options


186

Angularやと少し混同していますng-options

単純な配列があり、それを使用して選択を初期化したい。しかし、私はそのオプションの値=ラベルが欲しいです。

script.js

$scope.options = ['var1', 'var2', 'var3'];

html

<select ng-model="myselect" ng-options="o for o in options"></select>

私が得るもの:

<option value="0">var1</option>
<option value="1">var2</option>
<option value="2">var3</option>

私が欲しいもの:

<option value="var1">var1</option>
<option value="var2">var2</option>
<option value="var3">var3</option>

だから私は試しました:

<select ng-model="myselect2" ng-init=0 ng-options="options[k] as v for (k,v) in options"></select>

<select ng-model="myselect3" ng-init=0 ng-options="b as b for b in options"></select>

(しかし、それはうまくいきませんでした。)

編集:

私のフォームは外部に送信されるため、値として0ではなく「var1」が必要です。

回答:


303

あなたは実際に3回目の試みでそれを正しかった。

 <select ng-model="myselect" ng-options="o as o for o in options"></select>

ここで実際の例を参照してください:http : //plnkr.co/edit/xEERH2zDQ5mPXt9qCl6k?p=preview

トリックは、AngularJSがとにかく0からnまでの数としてキーを書き込み、モデルを更新するときに変換し直すことです。

その結果、HTMLは正しく表示されませんが、値を選択するときにモデルは適切に設定されます。(つまり、AngularJSは「0」を「var1」に変換し直します)

Epokkによるソリューションも機能しますが、データを非同期でロードしている場合、データが常に正しく更新されない場合があります。ngOptionsを使用すると、スコープが変更されたときに正しく更新されます。


1
あなたはトピックから外れています。指示が理解できませんでした。彼が望むvalue彼にselect
EpokK 2013

10
手順を理解しましたが、彼の意図は「値」をモデルにバインドすることであり、AngularJsがタグをレンダリングする方法が原因で何が起こっているのかを誤解しています。
James Davies

3
これは、値は0,1,2,3、ないVAR1、VAR2、VAR3になりますあなたは、角度での値を選択する得れば動作しますが、私の場合には(すなわち、古典的なフォームを送信)
Dragu

1
私はあなたがモデルにバインドしていると仮定しましたが、AngularJSを使用して外部から送信されたフォームをAngularにレンダリングする場合は、EpokKのソリューションを使用します。
James Davies

66
それは私だけですか、それともこれまでで最もジャッキアップされた不明瞭な構文ですか?
fool4jesus 2014

35

あなたは使うことができng-repeatoption、このように:

<form>
    <select ng-model="yourSelect" 
        ng-options="option as option for option in ['var1', 'var2', 'var3']"
        ng-init="yourSelect='var1'"></select>
    <input type="hidden" name="yourSelect" value="{{yourSelect}}" />
</form>

あなたがあなたを提出するとき、formあなたは隠された入力の価値を得ることができる。


DEMO

ng-selected ng-repeat


私の答えが減った場合は、新しい解決策を確認してください。
EpokK 2013

21

あなたは次のようなものを使うことができます

<select ng-model="myselect">
    <option ng-repeat="o in options" ng-selected="{{o==myselect}}" value="{{o}}">
        {{o}}
    </option>
</select>

ng-selectedを使用すると、myselectが事前に入力されている場合に備えて、オプションを事前選択できます。

ng-optionsは配列でのみ機能するため、とにかくこの方法をng-optionsよりも優先します。ng-repeatは、jsonのようなオブジェクトでも機能します。


1
ng-optionsオブジェクトデータソースでも機能します。docs.angularjs.org/api/ng/directive/select
Charlie Schliesserを

1
他の人が回避策を提供しましたが、この解決策は断然最もエレガントで古いHTMLスタイルに近く、角度モデルバインディングとフォーム送信の両方で動作します。ありがとう!
Fadi Chamieh 2014年

4
ng-selectedは角度ディレクティブなので、ハンドルバーは必要ありません。優れたソリューション。
Kasey Speakman、2014

20

次のようにselectを設定した場合:

<select ng-model="myselect" ng-options="b for b in options track by b"></select>

あなたは得るでしょう:

<option value="var1">var1</option>
<option value="var2">var2</option>
<option value="var3">var3</option>

作業フィドル:http : //jsfiddle.net/x8kCZ/15/


1
この解決策は、文字列の配列の初期値を選択するために私に役立つ唯一の解決策でした。
恵那

ええ、これが答えになるはずです。トラックバイは私にとって魔法です。
ガーナード

私は、少なくともソリューションの上、以下の後に期待していたが、これは簡単な方法出ていた
嚢Dahal

10
<select ng-model="option" ng-options="o for o in options">

$ scope.optionは、生成されたhtmlにvalue = "0"が表示されていても、変更後は 'var1'に等しくなります

プランカー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.