ถ้ามีคำสั่ง else ในเทมเพลต AngularJS


702

ฉันต้องการทำเงื่อนไขในเทมเพลต AngularJS ฉันดึงรายชื่อวิดีโอจาก Youtube API วิดีโอบางรายการมีอัตราส่วน 16: 9 และบางส่วนอยู่ในอัตราส่วน 4: 3

ฉันต้องการสร้างเงื่อนไขเช่นนี้:

if video.yt$aspectRatio equals widescreen then 
    element's attr height="270px"
else
    element's attr height="360px"

ฉัน iterating ng-repeatวิดีโอโดยใช้ ไม่มีความคิดว่าฉันควรทำอย่างไรสำหรับเงื่อนไขนี้:

  • เพิ่มฟังก์ชั่นในขอบเขตหรือไม่
  • ทำในเทมเพลตหรือไม่

2
ฉันพบบทความหนึ่งบทความถ้าที่นี่ goo.gl/wQ30uf
virender

คำตอบ:


1284

Angularjs (รุ่นด้านล่าง 1.1.5) ไม่ได้มีif/elseฟังก์ชันการทำงาน ตัวเลือกต่อไปนี้เป็นตัวเลือกในการพิจารณาสิ่งที่คุณต้องการบรรลุ:

( ข้ามไปยังการอัปเดตด้านล่าง (# 5) หากคุณใช้เวอร์ชั่น 1.1.5 หรือสูงกว่า )

1. ผู้ประกอบการที่ประกอบไปด้วย:

ตามคำแนะนำของ @Kirk ในความคิดเห็นวิธีที่สะอาดที่สุดในการทำเช่นนี้คือการใช้ผู้ประกอบการที่ประกอบไปด้วยดังนี้:

<span>{{isLarge ? 'video.large' : 'video.small'}}</span>

2. ng-switchคำสั่ง:

สามารถใช้สิ่งต่อไปนี้

<div ng-switch on="video">
    <div ng-switch-when="video.large">
        <!-- code to render a large video block-->
    </div>
    <div ng-switch-default>
        <!-- code to render the regular video block -->
    </div>
</div>

3. ng-hide/ ng-showคำสั่ง

หรือคุณอาจใช้ng-show/ng-hideแต่การใช้วิธีนี้จะแสดงทั้งวิดีโอขนาดใหญ่และองค์ประกอบวิดีโอขนาดเล็กจากนั้นซ่อนรายการที่ตรงตามng-hideเงื่อนไขและแสดงรายการที่ตรงตามng-showเงื่อนไข ดังนั้นในแต่ละหน้าคุณจะแสดงสององค์ประกอบที่แตกต่างกัน

4. ตัวเลือกอื่นที่ควรพิจารณาคือng-classคำสั่ง

สามารถใช้งานได้ดังนี้

<div ng-class="{large-video: video.large}">
    <!-- video block goes here -->
</div>

ด้านบนโดยทั่วไปจะเพิ่มlarge-videoคลาส CSS ไปยังองค์ประกอบ div ถ้าvideo.largeเป็นความจริง

ปรับปรุง: Angular 1.1.5แนะนำngIf directive

5. ng-ifคำสั่ง:

ในเวอร์ชันด้านบน1.1.5คุณสามารถใช้ng-ifคำสั่ง นี้จะลบองค์ประกอบถ้าแสดงออกให้ผลตอบแทนfalseและแทรกอีกครั้งelementใน DOM trueถ้าผลตอบแทนการแสดงออก สามารถใช้งานได้ดังนี้

<div ng-if="video == video.large">
    <!-- code to render a large video block-->
</div>
<div ng-if="video != video.large">
    <!-- code to render the regular video block -->
</div>

9
มันควรจะเป็นng-switch on="video"แทนng-switch-on="video"
czerasz

4
ทำอย่างไร if () {} else if () {} else if () {} else {} แต่รวมอยู่ใน dom เพียงองค์ประกอบเดียวเท่านั้น
falko

208
ยังประกอบไปด้วย<span>{{isAdded ? 'Added' : 'Add to cart'}}</span>
Kirk Strobeck

16
เก็บไว้ในใจว่าng-ifจะไม่เพิ่มองค์ประกอบที่ล้อมรอบไป DOM จนประเมินสภาพของการtrueแตกต่างและng-hide ng-show
Wilhelm Murdoch

1
ทำไมไม่ง่าย ๆng-switch="video"? ปัญหาบางอย่าง? หรือก่อนหน้านี้ไม่พร้อมใช้งาน สำหรับฉันมันใช้งานได้ค่อนข้างดี
Sami

175

ในรุ่นล่าสุดของเชิงมุม ( ณ วันที่ 1.1.5) ngIfพวกเขาได้รวมคำสั่งเงื่อนไขที่เรียกว่า มันแตกต่างจากngShowและngHideในที่องค์ประกอบจะไม่ถูกซ่อน แต่ไม่รวมอยู่ใน DOM เลย มีประโยชน์มากสำหรับส่วนประกอบที่มีค่าใช้จ่ายสูง แต่ไม่ได้ใช้

<div ng-if="video == video.large">
    <!-- code to render a large video block-->
</div>
<div ng-if="video != video.large">
    <!-- code to render the regular video block -->
</div>

5
โปรดทราบว่าการng-ifเปิดตัวขอบเขตบางแห่งเพื่อให้$parentกลายเป็นในร่างกายของ$parent.$parent ng-if
David Salamon

142

Ternary เป็นวิธีที่ชัดเจนที่สุดในการทำเช่นนี้

<div>{{ConditionVar ? 'varIsTrue' : 'varIsFalse'}}</div>

โฮที่จะทำสิ่งนี้ด้วย 2 เงื่อนไขในหรือ? ชอบ <div> {{A == B || A == C? 'varIsTrue': 'varIsFalse'}} </div>
YoBre

2
สรุป (A == B || A == C)
Oliver Dixon

1
รักคำตอบนี้! การใช้คำสั่ง ng- ให้จำนวนมาก html ที่ช่องว่างถ้า div ไม่พอใจสภาพ ..
sksallaj

48

แองกูลาร์ไม่ได้ให้ฟังก์ชันการทำงานอื่น / แต่คุณสามารถรับมันได้ด้วยการรวมโมดูลนี้:

https://github.com/zachsnow/ng-elif

ในคำพูดของตัวเองมันเป็นแค่ "ชุดคำสั่งควบคุมการไหลอย่างง่าย: ng-if, ng-else-if และ ng-else" ใช้งานง่ายและใช้งานง่าย

ตัวอย่าง:

<div ng-if="someCondition">
    ...
</div>
<div ng-else-if="someOtherCondition">
    ...
</div>
<div ng-else>
    ...
</div>

1
ฉันไม่ต้องการที่จะทำซ้ำรหัสใน div อีกครั้งและอีกครั้ง

1
คุณจะได้ไม่ต้องทำซ้ำอะไร - ng-if="someCondition && someOtherCondition"คุณได้อย่างง่ายดายสามารถทำ บางทีฉันอาจเข้าใจผิด? (ฉันเขียนโมดูลนั้น - มันควรจะทำงานเหมือนifและelseใน JS)
Zach Snow

1
นี่คือผู้ช่วยชีวิตที่แน่นอน นี่ควรเป็นส่วนหนึ่งของ Angular core ซึ่งขาดไม่ได้ในการเขียนโค้ดเทมเพลต วิธีที่สะอาดกว่าการมีผู้ประกอบการทั่วทุกสถานที่และเอาชนะข้อ จำกัด ของ ng-switch ที่ไม่สามารถประเมินนิพจน์ได้
Nico Westerdale

ขอบคุณ @NicoWesterdale! นอกจากนี้ฉันได้เพิ่ม ng-switch รุ่นที่สมบูรณ์ยิ่งขึ้นซึ่งคุณอาจพบว่ามีประโยชน์: github.com/zachsnow/ng-case
Zach Snow

30

คุณสามารถใช้video.yt$aspectRatioคุณสมบัติของคุณโดยตรงโดยส่งผ่านตัวกรองและเชื่อมโยงผลลัพธ์กับแอตทริบิวต์ height ในเทมเพลตของคุณ

ตัวกรองของคุณจะมีลักษณะดังนี้:

app.filter('videoHeight', function () {
  return function (input) {
    if (input === 'widescreen') {
      return '270px';
    } else {
      return '360px';
    }
  };
});

และแม่แบบจะเป็น:

<video height={{video.yt$aspectRatio | videoHeight}}></video>

รหัสของคุณvideo.yt$aspectRatioจะว่างเมื่อไหร่หรือไม่ได้กำหนด? เป็นไปได้หรือไม่ที่จะใช้ค่าเริ่มต้น
Fractaliste

13

ในกรณีนี้คุณต้องการ "คำนวณ" ค่าพิกเซลขึ้นอยู่กับคุณสมบัติของวัตถุ

ฉันจะกำหนดฟังก์ชั่นในคอนโทรลเลอร์ที่คำนวณค่าพิกเซล

ในตัวควบคุม:


$scope.GetHeight = function(aspect) {
   if(bla bla bla) return 270;
   return 360;
}

จากนั้นในเทมเพลตของคุณคุณเพียงแค่เขียน:


element height="{{ GetHeight(aspect) }}px "


11

ฉันยอมรับว่าternaryมีความสะอาดมาก ดูเหมือนว่ามันเป็นสถานการณ์ที่ดีแม้ว่าฉันจะต้องแสดง div หรือ p หรือตารางดังนั้นฉันมีตารางที่ฉันไม่ชอบไตรภาคเพราะเหตุผลที่ชัดเจน การโทรไปที่ฟังก์ชั่นนั้นโดยปกติแล้วจะเหมาะหรือในกรณีของฉันฉันทำสิ่งนี้:

<div ng-controller="TopNavCtrl">
        <div ng-if="info.host ==='servername'">
            <table class="table">
                <tr ng-repeat="(group, status) in user.groups">
                    <th style="width: 250px">{{ group }}</th>
                    <td><input type="checkbox" ng-model="user.groups[group]" /></td>
                </tr>
            </table>
        </div>
       <div ng-if="info.host ==='otherservername'">
            <table class="table">
                <tr ng-repeat="(group, status) in user.groups">
                    <th style="width: 250px">{{ group }}</th>
                    <td><input type="checkbox" ng-model="user.groups[group]" /></td>
                </tr>
            </table>
        </div>
</div>

4
    <div ng-if="modeldate==''"><span ng-message="required" class="change">Date is required</span> </div>

คุณสามารถใช้คำสั่ง ng-if ดังกล่าวข้างต้น


3

ความเป็นไปได้สำหรับ Angular: ฉันต้องรวมคำสั่ง if - ในส่วน html ฉันต้องตรวจสอบว่าตัวแปรทั้งหมดของ URL ที่ฉันสร้างถูกกำหนด ฉันทำตามวิธีต่อไปนี้และดูเหมือนว่าจะเป็นวิธีที่ยืดหยุ่น ฉันหวังว่ามันจะเป็นประโยชน์สำหรับใครบางคน

ส่วน html ในเทมเพลต:

    <div  *ngFor="let p of poemsInGrid; let i = index" >
        <a [routerLink]="produceFassungsLink(p[0],p[3])" routerLinkActive="active">
    </div>

และส่วน typescript:

  produceFassungsLink(titel: string, iri: string) {
      if(titel !== undefined && iri !== undefined) {
         return titel.split('/')[0] + '---' + iri.split('raeber/')[1];
      } else {
         return 'Linkinformation has not arrived yet';
      }
  }

ขอขอบคุณและขอแสดงความนับถือ,

ม.ค.


2
ดูเหมือน Angular มากกว่า AngularJS
pzaenger

@ pzaenger ใช่ แต่คำตอบมากมายสำหรับคำถามนี้ใช้ได้กับทั้งคู่ดังนั้นฉันคิดว่าบางคนอย่างฉันดูคำตอบอยู่ดี โปรดแจ้งให้เราทราบหากคุณต้องการ
Jan Clemens Stoffregen

2
ดี. อย่างน้อยคุณควรพูดถึงสิ่งนี้ในคำตอบของคุณ
pzaenger

@ pzaenger ขอบคุณสำหรับคำแนะนำนี้ฉันพูดถึงตอนนี้
Jan Clemens Stoffregen

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