Control Flow
ანგულარის მე-17 ვერსიიდან საშუალება გვაქვს, რომ სტრუქტურული დირექტივების
მაგივრად გამოვიყენოთ ახალი control flow სინტაქსი, რომლითაც ვმართავთ თემფლეითში
რა უნდა გამოჩდეს და როგორ უნდა გამოჩნდეს. ამ სინტაქსის ქივორდები @ სიმბოლოთი იწყება
და ძალიან ჰგავს ჯავასკრიპტის სტანდარტული if/else/switch/for სინტაქსს.
გაითვალისწინეთ, რომ ეს control-flow არის development preview-ში. ანუ ანგუალრის ახალ ვერსიებში მისი გამოყენების და ფუნქციონირების სპეციფიკა შეიძლება შეიცვალოს.
@if ბლოკი
@if ბლოკი მიწოდებული პირობის ჭეშმარიტების მიხედვით გამოაჩენს მის ბლოკში
არსებულ კონტენტს.
დავუშვათ კლასში ვინახავთ ორ თვისებას:
a = 1121;
a = 1118;თემფლეითში ამ ცვლადებისგან შეგვიძლია პირობითი ექსფრეშენის შედგენა:
@if (a > b) {
<p>{{a}} is greater than {{b}}</p>
}როგორც ჯავასკრიპტის if ბლოკს, ანგულარის თემფლეითში @if-ს შეგვიძლია
მოვაყოლოთ @else ახალი პირობით ან პირობის გარეშე:
@if (a > b) {
<p>{{a}} is greater than {{b}}</p>
} @else if (b > a) {
<p>{{a}} is less than {{b}}</p>
} @else {
<p>{{a}} is equal to {{b}}</p>
}ექსფრეშენის შედეგის ცვლადად გამოტანა
ხშირად რაღაც ექსფრეშენის შედეგი (მაგალითად Observable-ის შედეგი) გვინდა
რომ თემფლეითის ცვლადში შევინახოთ. @if-ში ეს შემდეგნაირად შეგვიძლია:
@if (users$ | async; as users) {
{{ users.length }}
}@for ბლოკი
მასივის თითოეული ელემენტის დასარენდერებლად ვიყენებთ @for ბლოკს, რომელიც ჰგავს
ჯავასკრიპტის for of სინტაქსს.
დავუშვათ, რომ კომპონენტის კლასში ვინახავთ შემდეგ მასივს:
items = [
{ name: "ტარიელ", id: "0142"},
{ name: "ავთანდილ", id: "0153"},
{ name: "ფრიდონ", id: "0294"},
]თუ თემფლეითში მათი სიაში გამოსახვა გვჭირდება:
<ul>
@for (item of items; track item.id) {
<li>{{ item.name }}</li>
}
</ul>ყურადღება მიაქციეთ, რომ აქ track ექსფრეშენი სავალდებულოა.
ეს უკანასკნელი არის NgFor დირექტივის trackBy ფუნქციის ალტერნატივა.
ჩვენ შეგვიძლია თემფლეითშივე მივუთითოთ რის მიხედვით განასხვავოს
ანგულარმა მასივის ელემენტები ერთმანეთისგან. ამ მაგალითში
თითოეულ item-ს პირობითად გააჩნია უნიკალური id ატრიბუტი.
თუ უნიკალური ატრიბუტი არ გვაქვს, შეგვიძლია trackBy-ს პირდაპირ იტერაციის ამჟამინდელი ერთეული მივაწოდოთ:
@for (item of items; track item) {
<li>{{ item.name }}</li>
}$index და სხვა იპმლიციტური ცვლადები
@for ბლოკის შიგნით საშუალება გვაქვს გამოვიყენოთ იმპლიციტური ცვლადები,
რომელსაც ანგულარი ლუპში გვაწვდის, მაგალითად $index:
<ul>
@for (item of items; track item.id) {
<li>{{ item.name }} {{$index}}</li>
}
</ul>იმპლიციტური ცვლადების ჩამონათვალი:
$count- მასივში არსებული ელემენტების რაოდენობა$index- მიმდინარე იტერაციის ინდექსი$first- მიმდინარე იტერაცია არის თუ არა პირველი$last- მიმდინარე იტერაცია არის თუ არა ბოლო$even- მიმდინარე იტერაცია არის თუ არა ლუწი$odd- მიმდინარე იტერაცია არის თუ არა კენტი
ეს ცვლადები ამ სახელებით ყოველთვის ხელმისაწვდომია, თუმცა
მათგან ალიასების შექმნაც შეგვიძლია let სეგმენტით:
<ul>
@for (item of items; track item.id; let idx = $index; let e = $even) {
<li>{{ item.name }} {{idx}}</li>
}
</ul>@empty ბლოკი
ჩვენ შეგვიძლია @for ბლოკს მოვაყოლოთ @empty ბლოკი, რომლის შიგთავსიც
მხოლოდ იმ შემთხვევაში გამოჩნდება, თუ მასივი ცარიელია:
<ul>
@for (item of items; track item.id) {
<li>{{ item.name }} {{$index}}</li>
} @empty {
<li>აქ არაფერია!</li>
}
</ul>@switch ბლოკი
@switch ბლოკი ჰგავს ჯავასკრიპტის switch-ს, სადაც შეგვიძლია კონკრეტული
მნიშვნელობის სხვადასხვა შემთხვევების მიხედვით გამოვაჩინოთ ინფორმაცია:
@switch (condition) {
@case (caseA) {
Case A.
}
@case (caseB) {
Case B.
}
@default {
Default case.
}
}პირობის ექსფრეშენის მნიშვნელობის შედარება ქეისთან ხდება ===
(მკაცრი ტოლობის) ოპერატორით.
@switch-ში არ ხდება ჯავასკრიპტისთვის ჩვეული fall-through,
ამიტომ break ან return-ის მსგავსი ქივორდები არ გვჭირდება.
@default ბლოკი არასავალდებულოა. თუ ის არ არსებობს და არც ერთი @case არ გამოდგა ჭეშმარიტი,
მაშინ შედეგად არაფერი გამოჩნდება.