typescript - Angular - Şablon içinde nesneler dizisi içinde saklanan nesnenin değerlerine erişim
Aşağıdaki gibi tek bir sınıfım var:
export class SettingsTab {
id: number;
class: string;
name: Object = {};
}
Ayrıca bunu basit bir diziye bölümlüyorum:
export const SETTINGSTABS: SettingsTab[] = [
{ id: 1, class: 'classOne', name: [{ "pl": "Tekst po polsku" }, { "en": "Text in english" }] },
{ id: 2, class: 'classTwo', name: [{ "pl": "Tekst po polsku" }, { "en": "Text in english" }] },
{ id: 3, class: 'classThree', name: [{ "pl": "Tekst po polsku" }, { "en": "Text in english" }] }
];
Şimdi, şablonumda hangi dili kullandığıma bağlı olarak name nesnesinin belirli bir değerine erişmek istiyorum. Mevcut dil hakkında bilgiyi aşağıda gösterildiği gibi localStorage'dan alıyorum:
language = localStorage.getItem('currentLang') != null ? localStorage.getItem('currentLang').replace("'", "") : "pl";
Bunu aşağıda listelenen kod ile başarmayı başardım:
<ng-container *ngFor="let name of settingsTab.name">
<ng-container *ngFor="let key of ObjectKeys(name)">
<span *ngIf="key == language">{{ name[key] }}</span>
</ng-container>
</ng-container>
NesneAnahtarları bileşenimde şöyle tanımlanmıştır:
ObjectKeys = Object.keys;
Ama benim sorum, yapmak istediğimi başarmanın daha kolay bir yolu var mı? İçlerinde *ngFor olan iki ng-component olmasını sevmiyorum. Ayrıca bunu en optimize şekilde başarmak isterim.
Cevap #1
İdeal olarak, name özelliği:
{ ..., name: [{ "pl": "Tekst po polsku" }, { "en": "Text in english" }] },
Bir nesne dizisi değil, bir nesne formatına sahip olur:
{ ..., name: {"pl": "Tekst po polsku", "en": "Text in english"} },
Sonra bunu şablonunuzda basitçe kullanabilirsiniz:
<span>{{ settingsTab.name[language] }}</span>
Bu, sabit zamanlı bir aramadır (sadece bir nesnedeki bir özelliği almak).
Şimdi, eğer name formatını değiştiremiyorsanız, bu iç içe ng-containerlar yerine bir yöntem kullanırdım:
export class MyComponent {
...
lang(names: [any], language: string) {
return (names.find(lang => lang[language]) || {})[language]
}
...
}
Ve bunu şöyle kullan:
<span>{{ lang(settingsTab.name, language) }}</span>
Elbette, lang'i uygun gördüğünüz her şeyle adlandırabilirsiniz. Sadece, bu alternatifin O(n) karmaşıklığına sahip olduğunu unutmayın; çünkü find, name dizisini döngüyle gezmek zorunda kalıyor. Bu muhtemelen uygulamanızın performansını hiç etkilemeyecektir, ancak bilmeniz gerektiğini düşündüm. name'in mevcut formatında, burası için daha hızlı bir yol yok.
Demo: https://stackblitz.com/edit/angular-c5wzbk?file=src/app/app.component.ts
