เหตุใด AngularJS จึงรวมตัวเลือกว่างไว้ในรายการ?


652

ฉันทำงานกับ AngularJS ในช่วงสองสามสัปดาห์ที่ผ่านมาและสิ่งหนึ่งที่รบกวนฉันจริงๆก็คือแม้หลังจากพยายามเปลี่ยนลำดับทั้งหมดหรือการกำหนดค่าที่กำหนดไว้ในสเปคที่http://docs.angularjs.org/api/ng .directive: selectฉันยังคงได้รับตัวเลือกว่างเป็นลูกคนแรกขององค์ประกอบที่เลือก

นี่คือหยก:

select.span9(ng-model='form.type', required, ng-options='option.value as option.name for option in typeOptions');

ที่นี่ตัวควบคุม:

$scope.typeOptions = [
    { name: 'Feature', value: 'feature' },
    { name: 'Bug', value: 'bug' },
    { name: 'Enhancement', value: 'enhancement' }
];

สุดท้ายนี่คือ HTML ที่สร้างขึ้น:

<select ng-model="form.type" required="required" ng-options="option.value as option.name for option in typeOptions" class="span9 ng-pristine ng-invalid ng-invalid-required">
    <option value="?" selected="selected"></option>
    <option value="0">Feature</option>
    <option value="1">Bug</option>
    <option value="2">Enhancement</option>
</select>

ฉันต้องทำอย่างไรเพื่อกำจัดมัน?

PS: สิ่งต่าง ๆ ทำงานโดยปราศจากสิ่งนี้เช่นกัน แต่มันก็ดูแปลกถ้าคุณใช้ select2 โดยไม่ต้องเลือกหลายตัว

คำตอบ:


646

ที่ว่างเปล่าoptionถูกสร้างขึ้นเมื่อค่าอ้างอิงโดยไม่ได้อยู่ในชุดของตัวเลือกส่งผ่านไปยังng-model ng-optionsสิ่งนี้เกิดขึ้นเพื่อป้องกันการเลือกรูปแบบโดยไม่ตั้งใจ: AngularJS สามารถเห็นได้ว่ารูปแบบเริ่มต้นนั้นไม่ได้กำหนดหรือไม่อยู่ในชุดตัวเลือกและไม่ต้องการตัดสินใจค่ารุ่นด้วยตัวเอง

หากคุณต้องการกำจัดตัวเลือกที่ว่างเปล่าให้เลือกค่าเริ่มต้นในคอนโทรลเลอร์ของคุณดังนี้:

$scope.form.type = $scope.typeOptions[0].value;

นี่คือ jsFiddle: http://jsfiddle.net/MTfRD/3/

กล่าวโดยย่อ: ตัวเลือกที่ว่างเปล่าหมายความว่าไม่มีการเลือกรูปแบบที่ถูกต้อง (โดยที่ถูกต้องฉันหมายถึง: จากชุดตัวเลือก) คุณต้องเลือกค่ารุ่นที่ถูกต้องเพื่อกำจัดตัวเลือกที่ว่างเปล่านี้


7
ฉันลองทั้ง $ scope.form.type = ''; และ $ scope.form.type = $ scope.typeOptions [0] อย่างไรก็ตามฉันยังคงเห็นสิ่งนี้ - <option value = "?" selected = "selected"> </option>
Sudhanshu

5
บางครั้งมันไม่สมเหตุสมผลที่จะมีข้อมูลนี้ใน JS หากเป็นเซิร์ฟเวอร์ที่ตัดสินใจเกี่ยวกับสิ่งที่เลือกไว้ทำไม JS ต้องทำซ้ำ
heneryville

11
น่าเสียดายที่นี่ใช้งานไม่ได้หากคุณใช้อาร์เรย์และnullเป็นหนึ่งในค่าของคุณ
vpiTriumph

6
เป็นไปได้หรือไม่ที่จะเพิ่มข้อความในช่องว่าง<option>เพื่อให้ทททแองกูลาร์สร้างสิ่งที่ต้องการ<option value="?">Select an option</option>
RPDeshaies

3
@ Tareck117 เพียงแค่ wirte <option value="">Select an option</option>นั่นคือค่า null ของรายการตัวเลือก ไม่จำเป็นสำหรับ? - ตัวละคร
เซบาสเตียน

235

หากคุณต้องการค่าเริ่มต้นให้ดูที่คำตอบของ @ pkozlowski.opensource ซึ่ง FYI สามารถนำไปใช้ในมุมมอง (แทนที่จะเป็นในคอนโทรลเลอร์) โดยใช้ ng-init:

<select ng-model="form.type" required="required" ng-init="form.type='bug'"
  ng-options="option.value as option.name for option in typeOptions" >
</select>

หากคุณไม่ต้องการค่าเริ่มต้น "องค์ประกอบฮาร์ดโค้ดเดียวที่มีการตั้งค่าเป็นสตริงว่างสามารถซ้อนอยู่ในองค์ประกอบองค์ประกอบนี้จะเป็นตัวแทนของโมฆะหรือตัวเลือก" ไม่ได้เลือก ":

<select ng-model="form.type" required="required"
  ng-options="option.value as option.name for option in typeOptions" >
    <option style="display:none" value="">select a type</option>
</select>

4
@hugo, ซอทำปริศนา : jsfiddle.net/4qKyx/1 โปรดทราบว่ามีการแสดง "เลือกประเภท" แต่ไม่มีค่าที่เกี่ยวข้อง และเมื่อคุณเลือกอย่างอื่นคุณจะไม่เห็นมันอีก (ทดสอบกับ Chrome)
ทำเครื่องหมาย Rajcok

1
@ MarkRajcok - ข้อเสนอแนะที่ยอดเยี่ยม! ฉันสะดุดในปัญหาอื่นโดยใช้ตัวอย่างของคุณด้วยคำสั่ง transcluding คุณช่วยดูหน่อยได้ไหม? plnkr.co/edit/efaZdEQlNfoDihk1R1zc?p=preview
Jan-Terje Sørensen

2
ปัญหาเกี่ยวกับสิ่งนี้คือคุณยังคงสามารถเลือกด้วยคีย์บอร์ดดูstackoverflow.com/a/8442831/57344โซลูชัน
HaveAGuess

2
สิ่งนี้อาจใช้งานได้ในขณะนี้ แต่เอกสารเชิงมุมแนะนำให้ใช้ ng-init โดยเฉพาะกับสิ่งอื่นนอกจาก ng-repeat - ดูdocs.angularjs.org/api/ng/directive/ngInit
Ed Norris

3
ไม่ทำงานใน IE10 "เลือกประเภท" จะสามารถมองเห็นและเลือกได้เสมอ
Robin

121

เชิงมุม <1.4

สำหรับใครก็ตามที่ถือว่า "null" เป็นค่าที่ถูกต้องสำหรับหนึ่งในตัวเลือก (ดังนั้นลองจินตนาการว่า "null" เป็นค่าของรายการใดรายการหนึ่งในtypeOptionsในตัวอย่างด้านล่าง) ฉันพบว่าวิธีที่ง่ายที่สุดเพื่อให้แน่ใจว่าเพิ่มโดยอัตโนมัติ ตัวเลือกที่ซ่อนอยู่คือการใช้ ng-if

<select ng-options="option.value as option.name for option in typeOptions">
    <option value="" ng-if="false"></option>
</select>

ทำไมต้องng-ifและไม่ใช่ ng-hide? เนื่องจากคุณต้องการตัวเลือก css ที่จะกำหนดเป้าหมายตัวเลือกแรกภายในด้านบนเลือกเพื่อกำหนดเป้าหมายตัวเลือก "ของจริง" ไม่ใช่ตัวเลือกที่ซ่อนอยู่ มันจะมีประโยชน์เมื่อคุณใช้ไม้โปรแทรกเตอร์สำหรับการทดสอบ e2e และ (ด้วยเหตุผลใดก็ตาม) ที่คุณใช้ by.css () เพื่อกำหนดเป้าหมายตัวเลือกที่เลือก

เชิงมุม> = 1.4

เนื่องจากการปรับเปลี่ยนคำสั่งการเลือกและตัวเลือกใหม่การใช้ng-ifจึงไม่ใช่ตัวเลือกที่ใช้งานได้ดังนั้นคุณต้องหันมาใช้ng-show="false"เพื่อให้มันทำงานได้อีกครั้ง


5
ควรเป็นคำตอบที่ยอมรับได้เนื่องจากนี่เป็นพฤติกรรมการมองเห็นที่ถูกต้องสำหรับการเลือก คุณใส่size="5"คุณสมบัติที่เลือกแล้วคุณจะเห็นว่าไม่มีอะไรที่เลือก! ชอบในการเริ่มต้น<select>-Element! ผมไม่เข้าใจว่าทำไมเชิงมุมจะทำสิ่งดังกล่าวสำหรับการเลือกโดยไม่ต้องmultipleแอตทริบิวต์ ...
เซบาสเตียน

1
ใช่ฉันเห็นด้วยนี่ควรเป็นคำตอบที่ยอมรับได้ นี่คือ 'เชิงมุม' ng-if จะลบองค์ประกอบตัวเลือกออกจาก dom (เมื่อเป็นเท็จ) ดังนั้นวิธีนี้จึงใช้ได้กับเบราว์เซอร์ทั้งหมดโดยไม่มีการเข้ารหัส 'hacky' (ตรงกันข้ามกับ ng-hide หรือ ng-show)
Sander_P

2
@Sander_P ตามคำนิยามวิธีนี้คือการเข้ารหัส "แฮ็ค" ในความคิดของฉัน (วางบางสิ่งในโดมเพื่อหลอกล่อเชิงมุมเอามันออกไป) แต่คุณพูดถูกมันก็ยังเป็นทางออกที่ดีที่สุด วิธีการแก้ปัญหา "ดียิ่งขึ้น" จะช่วยให้การเลือก friggin ที่ไม่มีค่า! ห่า? มันไม่ได้เป็นแบบนี้กับสถานการณ์ขอบ
dudewad

@dudewad: สิ่งต่าง ๆ อาจทำงานได้ดีขึ้นด้วย Angular 1.4 จากบล็อก AngularJS สำหรับ 1.4.0: "ngOptions ได้รับการปรับโครงสร้างใหม่อย่างสมบูรณ์เพื่อให้ได้รับการแก้ไขข้อบกพร่องที่น่ารำคาญ"
Sander_P

1
ฮ่าฮ่า "โรคจิตที่น่ารำคาญ" ตกลง. ฉันยังสับสนนิดหน่อยเมื่อพูดถึงการอัพเกรด 3 วันก่อนส่งมอบดังนั้นฉันจะคอยแก้ปัญหาของคุณในตอนนี้ซึ่งดูเหมือนว่าจะทำงานได้ว่ายน้ำ ตั้งข้อสังเกตสำหรับอนาคตแม้ว่า :) ขอบคุณ!
dudewad

36

อาจมีประโยชน์สำหรับใครบางคน:

หากคุณต้องการใช้ตัวเลือกธรรมดาแทน ng-options คุณสามารถทำได้ดังนี้:

<select ng-model="sortorder" ng-init="sortorder='publish_date'">
  <option value="publish_date">Ascending</option>
  <option value="-publish_date">Descending</option>
</select>

ตั้งค่าแบบอินไลน์ ใช้ ng-init เพื่อกำจัดตัวเลือกที่ว่างเปล่า


ฉันไม่สามารถหาตัวอย่างที่ชัดเจนของการตั้งค่า ng-options กับ OBJECTS แทนที่จะเป็นอาร์เรย์ JSON และเมื่อฉันพยายามที่จะ "แปล" ระหว่างทั้งสองไม่เพียง แต่มันไม่ได้ออกมาอย่างถูกต้อง แต่มันล้มเหลว "เงียบ ๆ " ดังนั้น ฉันยังไม่รู้เลยว่าฉันทำอะไรผิด ในที่สุดฉันก็เลือกใช้ ng-repeat ธรรมดาในแท็กตัวเลือก ฉันรู้ว่ามันไม่ใช่วิธีปฏิบัติที่ดีที่สุด แต่อย่างน้อยก็ใช้ได้ หากใครสามารถชี้ให้ฉันตรงไปตรงมาถอดเปลี่ยนได้ง่ายในรายละเอียดตัวอย่างการทำงานที่เป็นมิตรกับเชิงมุม - n00b โดยใช้ตัวเลือก ng กับวัตถุข้อมูล (ไม่ใช่ JSON) ฉันจะร่าเริงมาก ร่าเริงสองครั้งหากใช้ ng-init เช่นกัน
code-sushi

ฉันใช้ตัวเลือกธรรมดา แต่ในตัวควบคุมฉันดูเหมือนจะไม่ได้รับค่าของแบบเลื่อนลงที่เลือก เช่นฉันพยายามแจ้งเตือน ($ scope.sortorder.value); และการแจ้งเตือน ($ scope.sortorder); ทั้งสองให้ไม่ได้กำหนด จะรับค่าที่เลือกได้อย่างไรที่นี่?
ไม่ฝักใฝ่ฝ่ายใด Riz

ขอบคุณมากสำหรับเรื่องนี้. ฉันกำลังจะเขียนวัตถุที่ไร้ประโยชน์อย่างสมบูรณ์ในคอนโทรลเลอร์ที่ฉันไม่ต้องการฉันแค่ต้องการตัวเลือกที่ง่าย .. ขอบคุณอีกครั้ง
มูฮัมหมัดบินยุสรัตน์

22

มีบางอย่างที่คล้ายกันเกิดขึ้นกับฉันเช่นกันและเกิดจากการอัปเกรดเป็นเชิงมุม 1.5 ng-initดูเหมือนว่าจะถูกแยกวิเคราะห์สำหรับประเภทในรุ่นที่ใหม่กว่าของ Angular ในเก่าเชิงมุมng-init="myModelName=600"จะแมปไปยังตัวเลือกที่มีค่า "600" มี IE <option value="600">First</option>แต่ในเชิงมุม 1.5 มันจะไม่พบนี้ที่ดูเหมือนว่าจะได้รับการคาดหวังว่าจะหาตัวเลือกที่มีมูลค่า 600 <option value=600>First</option>คือ Angular จะแทรกรายการแรกแบบสุ่ม:

<option value="? number:600 ?"></option>

เชิงมุม <1.2.x

<select ng-model="myModelName" ng-init="myModelName=600">
  <option value="600">First</option>
  <option value="700">Second</option>
</select>

เชิงมุม> 1.2

<select ng-model="myModelName" ng-init="myModelName='600'">
  <option value="600">First</option>
  <option value="700">Second</option>
</select>

1
ขอบคุณ! ในกรณีของฉันฉันไม่สามารถใช้ ng-init (ไม่มีค่าเริ่มต้น) ดังนั้นฉันจึงนำแบบจำลองของฉันไปใช้กับสตริงและใช้งานได้!
Rodrigo Graça

มีประโยชน์มากสำหรับปัญหาการผลิตแอปพลิเคชันของฉัน ขอบคุณ @Nabil Boag
Venki

3
งานนี้แน่นอน แต่ตัวเลือกที่ดีคือการใช้งานng-value="600"ในแทนoption valueมันจะแจงเป็นตัวเลขและคุณไม่จำเป็นต้องแปลงค่าของคุณเหมือนที่คุณทำตอนนี้ :)
Max

@ Max ฉันลองคำตอบที่มีมูลค่าสูงมาก แต่ก็ไม่มีใครทำงานจนกว่าฉันจะพบคุณ ขอบคุณ.
แอนดรู

21

ท่ามกลางประชาชนของคำตอบที่นี่ผมคิดฉัน repost วิธีการแก้ปัญหาที่ทำงานสำหรับฉันและได้พบกับทุกเงื่อนไขต่อไปนี้:

  • ให้ยึด / พรอมต์เมื่อ NG-รุ่นfalsy (เช่น "เราควร region--" ว. วชิรvalue="")
  • เมื่อค่า ng-model เป็นเท็จและผู้ใช้เปิดตัวเลือกแบบเลื่อนลงตัวยึดจะถูกเลือก (โซลูชันอื่น ๆ ที่กล่าวถึงที่นี่ทำให้ตัวเลือกแรกปรากฏขึ้นซึ่งเลือกซึ่งอาจทำให้เข้าใจผิด)
  • อนุญาตให้ผู้ใช้ยกเลิกการเลือกค่าที่ถูกต้องเป็นหลักในการเลือกค่าเท็จ / ค่าเริ่มต้นอีกครั้ง

ป้อนคำอธิบายรูปภาพที่นี่

รหัส

<select name="market_vertical" ng-model="vc.viewData.market_vertical"
    ng-options="opt as (opt | capitalizeFirst) for opt in vc.adminData.regions">

    <option ng-selected="true" value="">select a market vertical</option>
</select>

src

q & a ดั้งเดิม - https://stackoverflow.com/a/32880941/1121919


คุณหมายถึงว่าค่าเริ่มต้นคือ<option ng-selected="true" value="null">อะไร?
jusopi

ฉันหมายถึงถ้าค่า ng-model ถูกกำหนดเป็นโมฆะ, ตัวสร้างเชิงมุมและตัวเลือกที่ว่างบนตัวเลือก
Flezcano

16

ทางออกที่รวดเร็ว:

select option:empty { display:none }

หวังว่าจะช่วยใครซักคน อุดมคติแล้วคำตอบที่เลือกควรเป็นแนวทาง แต่หากในกรณีที่ไม่สามารถทำได้ควรทำงานเป็นปะแก้


2
ตามการทดสอบของฉันสิ่งนี้จะใช้ได้เฉพาะใน Chrome (Chrome ใหม่ด้านบน) และ Firefox IE และ Safari break ไม่ทราบเกี่ยวกับโอเปร่าและเบราว์เซอร์ขอบอื่น ๆ ไม่ว่าจะด้วยวิธีใดวิธีนี้ไม่ใช่ทางออกที่ดี
dudewad

ที่เราควรวางไว้ใน html ก่อนปิด <select> หรืออื่น ๆ ใน js
H Varma

1
@HVarma เป็นกฎ CSS วางไว้ในสไตล์ชีทหรือในแท็ก <style>
KK

@KK stackoverflow.com/questions/48355599/…คุณช่วยตรวจสอบสิ่งนี้ได้ไหม?
Sudarshan Kalebere

14

ใช่ ng-model จะสร้างค่าตัวเลือกที่ว่างเปล่าเมื่อคุณสมบัติ ng-model ไม่ได้กำหนดไว้ เราสามารถหลีกเลี่ยงสิ่งนี้ได้ถ้าเรากำหนด object ให้กับ ng-model

ตัวอย่าง

การเข้ารหัสเชิงมุม

$scope.collections = [
    { name: 'Feature', value: 'feature' }, 
    { name: 'Bug', value: 'bug' }, 
    { name: 'Enhancement', value: 'enhancement'}
];

$scope.selectedOption = $scope.collections[0];


<select class='form-control' data-ng-model='selectedOption' data-ng-options='item as item.name for item in collections'></select>

โน๊ตสำคัญ:

กำหนดวัตถุของอาร์เรย์เช่น $ scope.collections [0] หรือ $ scope.collections [1] ให้กับ ng-model อย่าใช้คุณสมบัติของวัตถุ หากคุณได้รับค่าตัวเลือกเลือกจากเซิร์ฟเวอร์โดยใช้ฟังก์ชั่นโทรกลับกำหนดวัตถุให้กับรุ่น NG

หมายเหตุจากเอกสารเชิงมุม

หมายเหตุ: ngModel เปรียบเทียบโดยการอ้างอิงไม่ใช่ค่า สิ่งนี้มีความสำคัญเมื่อเชื่อมโยงกับอาร์เรย์ของวัตถุ ดูตัวอย่างhttp://jsfiddle.net/qWzTb/

ฉันได้ลองหลายครั้งในที่สุดฉันก็พบว่ามัน


8

แม้ว่าคำตอบของ @ pkozlowski.opensource และ @ Mark นั้นถูกต้อง แต่ฉันต้องการแชร์เวอร์ชันที่แก้ไขเล็กน้อยของฉันโดยที่ฉันมักจะเลือกรายการแรกในรายการโดยไม่คำนึงถึงค่าของมัน:

<select ng-options="option.value as option.name for option in typeOptions" ng-init="form.type=typeOptions[0].value">
</select>

4

ฉันใช้ Angular 1.4x และฉันพบตัวอย่างนี้ดังนั้นฉันใช้ ng-init เพื่อตั้งค่าเริ่มต้นใน select:

<select ng-init="foo = foo || items[0]" ng-model="foo" ng-options="item as item.id for item in items"></select>

3


ฉันประสบปัญหาเดียวกัน หากคุณกำลังโพสต์ฟอร์มเชิงมุมที่มีการโพสต์ปกติแล้วคุณจะพบปัญหานี้เนื่องจากเชิงมุมไม่อนุญาตให้คุณตั้งค่าสำหรับตัวเลือกในแบบที่คุณใช้ หากคุณได้รับค่าของ "form.type" จากนั้นคุณจะพบค่าที่เหมาะสม คุณต้องโพสต์วัตถุเชิงมุมมันไม่ได้เป็นแบบฟอร์มการโพสต์


3

วิธีแก้ปัญหาอย่างง่ายคือการตั้งค่าตัวเลือกที่มีค่าว่างเปล่าที่""ฉันพบซึ่งจะเป็นการกำจัดตัวเลือกที่ไม่ได้กำหนดเพิ่มเติม


5
ทำงานที่ @ 1.4.3, เพิ่งเพิ่ม 2 ตัวเลือกที่ว่างเปล่าลงในแบบฟอร์ม
Denny Mueller

3

ตกลงจริง ๆ แล้วคำตอบนั้นง่ายมาก: เมื่อมีตัวเลือกที่ไม่เป็นที่รู้จักโดย Angular จะมีตัวเลือกที่น่าเบื่อ สิ่งที่คุณทำผิดคือเมื่อคุณใช้ ng-options มันจะอ่านวัตถุพูด[{ id: 10, name: test }, { id: 11, name: test2 }] right?

นี่คือค่าโมเดลของคุณที่ต้องประเมินมันเท่ากันคุณต้องการให้ค่าที่เลือกเป็น 10 คุณต้องตั้งค่าโมเดลของคุณเป็นค่าเช่น{ id: 10, name: test }เลือก 10 ดังนั้นมันจะไม่สร้างถังขยะนั้น

หวังว่าจะช่วยให้ทุกคนเข้าใจฉันมีเวลาลอง :)


2

วิธีนี้ใช้ได้ผลสำหรับฉัน:

<select ng-model="mymodel">    
   <option ng-value="''" style="display:none;" selected>Country</option>
   <option value="US">USA</option>
</select>

Downvote อาจเป็นเพราะการใช้ CSS กับองค์ประกอบตัวเลือกไม่สามารถใช้ได้กับทุกเบราว์เซอร์
Kafoso

ฉันเพิ่งทดสอบกับ Chrome, FireFox, Safari และ Edge - ทุกอย่างใช้งานได้
MMM

@MMM "เบราว์เซอร์ทั้งหมด" รวมถึง IE ผู้ใช้จำนวนมากยังคงติดอยู่กับ IE 10 และ 11 และนั่นอาจเป็นสาเหตุที่ทำให้เกิด downvote Chrome, fF, Saf และ Edge ไม่ใช่ "เบราว์เซอร์ทั้งหมด"
PKD

1

สิ่งนี้ใช้ได้สำหรับฉัน

<select ng-init="basicProfile.casteId" ng-model="basicProfile.casteId" class="form-control">
     <option value="0">Select Caste....</option>
     <option data-ng-repeat="option in formCastes" value="{{option.id}}">{{option.casteName}}</option>
 </select>

เพียงแค่เพิ่มตัวเลือกลงในรายการและออกจากพื้นที่ว่างเปล่าเศร้า
จำกัด ระยะ

1

มันใช้งานได้ดีอย่างสมบูรณ์แบบ

<select ng-model="contact.Title" ng-options="co for co in['Mr.','Ms.','Mrs.','Dr.','Prof.']">
    <option style="display:none" value=""></option>
</select>

วิธีการทำงานคือให้ตัวเลือกแรกที่จะแสดงก่อนที่จะเลือกบางสิ่งและการdisplay:noneลบมันจะเป็นแบบเลื่อนลงดังนั้นหากคุณต้องการคุณสามารถทำได้

<select ng-model="contact.Title" ng-options="co for co in['Mr.','Ms.','Mrs.','Dr.','Prof.']">
    <option style="display:none" value="">select an option...</option>
</select>

และสิ่งนี้จะให้คุณselect and optionก่อนเลือก แต่เมื่อเลือกแล้วมันจะหายไปและจะไม่แสดงในรายการแบบหล่นลง


จริงๆแล้วคุณไม่ได้ตอบคำถามเองที่เลวร้ายยิ่งกว่านั้นคุณแค่ซ่อนองค์ประกอบ
มาร์โก

0

ลองอันนี้ในคอนโทรลเลอร์ของคุณตามลำดับเดียวกัน:

$scope.typeOptions = [
    { name: 'Feature', value: 'feature' }, 
    { name: 'Bug', value: 'bug' }, 
    { name: 'Enhancement', value: 'enhancement' }
];
$scope.form.type = $scope.typeOptions[0];

ฉันลองใช้วิธีการของคุณ แต่น่าเสียดายที่ฉันไม่สามารถใช้งานได้ คุณช่วยดูซอนี้ได้ไหม jsfiddle.net/5PdaX
Aniket Sinha

0

นี่คือการแก้ไข:

สำหรับข้อมูลตัวอย่างเช่น:

financeRef.pageCount = [{listCount:10,listName:modelStrings.COMMON_TEN_PAGE},    
{listCount:25,listName:modelStrings.COMMON_TWENTYFIVE_PAGE},
{listCount:50,listName:modelStrings.COMMON_FIFTY_PAGE}];

ตัวเลือกที่เลือกควรเป็นดังนี้: -

<select ng-model="financeRef.financeLimit" ng-change="financeRef.updateRecords(1)" 
class="perPageCount" ng-show="financeRef.showTable" ng-init="financeRef.financeLimit=10"
ng-options="value.listCount as value.listName for  value in financeRef.pageCount"
></select>

จุดที่ถูกเมื่อเราเขียนvalue.listCountเป็นvalue.listNameมันโดยอัตโนมัติข้อความในvalue.listNameแต่ค่าของตัวเลือกที่เลือกคือvalue.listCountแม้ว่าค่าของฉันแสดงปกติ 0,1,2 .. และอื่น ๆ !!!

ในกรณีของฉันfinanceRef.financeLimitคือการคว้าvalue.listCountและฉันสามารถทำการจัดการของฉันในตัวควบคุมแบบไดนามิก


0

ฉันต้องการเพิ่มว่าถ้าค่าเริ่มต้นมาจากการผูกจากองค์ประกอบหลักหรือองค์ประกอบ 1.5 ตรวจสอบให้แน่ใจว่าประเภทที่เหมาะสมจะถูกส่งผ่าน หากใช้@ในการเชื่อมโยงตัวแปรที่ส่งผ่านจะเป็นสตริงและหากมีตัวเลือกเช่น จำนวนเต็มจากนั้นตัวเลือกที่ว่างจะปรากฏขึ้น

แยกวิเคราะห์ค่าใน init อย่างถูกต้องหรือเชื่อมโยงด้วย<และไม่@แนะนำให้ใช้กับประสิทธิภาพน้อยกว่าเว้นแต่จำเป็น


0

ทางออกที่ง่าย

<select ng-model='form.type' required><options>
<option ng-repeat="tp in typeOptions" ng-selected="    
{{form.type==tp.value?true:false}}" value="{{tp.value}}">{{tp.name}}</option>


0

โซลูชันการบดด้วย jQuery เมื่อคุณไม่ได้ควบคุมตัวเลือก

HTML:

<select id="selector" ng-select="selector" data-ng-init=init() >
...
</select>

js:

$scope.init = function () {
    jQuery('#selector option:first').remove();
    $scope.selector=jQuery('#selector option:first').val();
}

ปาสคาลมีคนโหวตให้คุณเพราะนี่เป็นวิธีการแก้ปัญหา jQuery ไม่ใช่ AngularJs
Mawg พูดว่าการคืนสถานะโมนิก้า

คำถามถูกขอให้ขุดเพิ่มเติมของ Angular ... : - /
Sahu V Kumar


0

ฉันมีปัญหาเดียวกันฉัน (ลบ "ng-model") เปลี่ยนสิ่งนี้:

<select ng-model="mapayear" id="mapayear" name="mapayear" style="  display:inline-block !important;  max-width: 20%;" class="form-control">
  <option id="removable" hidden> Selecione u </option>
    <option selected ng-repeat="x in anos" value="{{ x.ano }}">{{ x.ano }}
</option>
</select>

สำหรับสิ่งนี้:

<select id="mapayear" name="mapayear" style="  display:inline-block !important;  max-width: 20%;" class="form-control">
  <option id="removable" hidden> Selecione u </option>
    <option selected ng-repeat="x in anos" value="{{ x.ano }}">{{ x.ano }}
</option>
</select>

ตอนนี้มันใช้งานได้ แต่ในกรณีของฉันมันทำให้ ive ลบขอบเขตนั้นจาก ng.controller ตรวจสอบว่าคุณไม่ได้ทำแบบเดียวกัน


0

สวัสดีฉันมี jQuery ที่อ้างอิงจากมือถือและฉันลบมันออก ด้วย jQuery mobile การแก้ไขใด ๆ ข้างต้นไม่ได้ผลสำหรับฉัน (มันยอดเยี่ยมถ้ามีใครสามารถอธิบายความขัดแย้งระหว่าง jQuery Mobile และ Angular JS)

https://guntucomputerhacks.blogspot.com.au/2017/10/angular-js-drop-down-first-options-vs.html


0

สิ่งเดียวที่ใช้ได้ผลสำหรับฉันคือใช้track byในng-optionsเช่นนี้:

 <select class="dropdown" ng-model="selectedUserTable" ng-options="option.Id as option.Name for option in userTables track by option.Id">


ถ้าผมใช้วิธีนี้ng-optionได้รับค่าสุดท้ายของอาร์เรย์ที่ฉันต้องการที่จะคุ้มค่าชุดของoption selectมันไม่ได้แก้ไข :(
rufatZZ

0

อ้างถึงตัวอย่างจากเอกสารประกอบเชิงมุมวิธีการเอาชนะปัญหาเหล่านี้

  1. ไปที่ลิงค์เอกสารนี้ที่นี่
  2. ค้นหา ' การเชื่อมโยงเลือกเป็นค่าที่ไม่ใช่สตริงผ่านการแยกวิเคราะห์ / จัดรูปแบบ ngModel '
  3. มีคุณสามารถดูมีคำสั่งที่เรียกว่า ' convertToNumber ' แก้ปัญหา

มันใช้งานได้สำหรับฉัน สามารถดูวิธีการใช้งานได้ที่นี่


0

เราสามารถใช้ CSS เพื่อซ่อนตัวเลือกแรก แต่มันจะไม่ทำงานใน IE 10, 11 วิธีที่ดีที่สุดคือการลบองค์ประกอบโดยใช้ Jquery วิธีนี้ใช้ได้กับเบราว์เซอร์หลักที่ทดสอบด้วย chrome และ IE10, 11

นอกจากนี้หากคุณกำลังใช้งานเชิงมุมบางครั้งการใช้งาน setTimeout

$scope.RemoveFirstOptionElement = function (element) {
    setTimeout(function () {
        $(element.children()[0]).remove();
    }, 0);
};
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.