ตัวเลือก ng กับ init อาร์เรย์ที่เรียบง่าย


187

ฉันนิด ๆ หน่อย ๆ ng-optionsสับสนกับเชิงมุมและ

ฉันมีอาร์เรย์ที่เรียบง่ายและฉันต้องการเริ่มต้นการเลือกด้วย แต่ฉันต้องการตัวเลือก value = label

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>

(แต่มันไม่ทำงาน)

แก้ไข:

แบบฟอร์มของฉันถูกส่งจากภายนอกซึ่งเป็นสาเหตุที่ฉันต้องการ 'var1' เป็นค่าแทนที่จะเป็น 0

คำตอบ:


304

คุณถูกต้องจริงในความพยายามครั้งที่สามของคุณ

 <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

10
ฉันเข้าใจคำแนะนำ แต่เป็นไปได้ว่าเขาตั้งใจจะผูกมัด 'คุณค่า' ของแบบจำลองและเข้าใจผิดว่าเกิดอะไรขึ้นเนื่องจากวิธีที่ AngularJs แสดงแท็ก
James Davies

3
ใช้งานได้ถ้าคุณได้รับค่าของตัวเลือกที่มีเชิงมุม แต่ในกรณีของฉัน (เช่นแบบฟอร์มส่งแบบดั้งเดิม) ค่าจะเป็น 0,1,2,3 ไม่ใช่ var1, var2, var3
Dragu

1
ฉันคิดว่าคุณมีความผูกพันกับโมเดล แต่ถ้าคุณเพียงแค่ใช้ AngularJS เพื่อสร้างแบบฟอร์มที่ส่งจากภายนอกไปยังเชิงมุมจากนั้นใช้โซลูชันของ EpokK
James Davies

66
มันเป็นแค่ฉันหรือนี่เป็นไวยากรณ์ที่ได้รับการฝึกฝนมากที่สุดและไม่ชัดเจนหรือไม่?
fool4jesus

35

คุณสามารถใช้ng-repeatกับoptionสิ่งนี้:

<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 ซ้ำ


หากคุณได้ยกเลิกคำตอบของฉันแล้วให้ตรวจสอบโซลูชันใหม่ของฉัน
EpokK

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

4
ng-selected ไม่จำเป็นต้องใช้แฮนด์บาร์เนื่องจากเป็นคำสั่งเชิงมุม ทางออกที่ดีเยี่ยม
Kasey Speakman

20

หากคุณตั้งค่าการเลือกดังนี้:

<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
วิธีนี้เป็นวิธีเดียวที่ใช้งานได้สำหรับการเลือกค่าเริ่มต้นในอาร์เรย์ของสตริง
Ena

ใช่สิ่งนี้ควรเป็นคำตอบแทร็คที่ทำเพื่อฉัน
Gurnard

ฉันคาดหวังน้อยที่สุดหลังจากทำตามวิธีแก้ปัญหาข้างต้น แต่นี่เป็นวิธีที่ง่ายออก
ถุงดาห์ล

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

$ scope.option จะเท่ากับ 'var1' หลังการเปลี่ยนแปลงแม้คุณจะเห็น value = "0" ใน html ที่สร้างขึ้น

plunker

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.