2016-04-12 16 views
1

Bu başlayanlar soru .. ben Angular2 belgeleri okuyarak edilmiştir , G/kaydetme mevcut işlevselliği iptal marka için kullanılan hizmet Restore Hiyerarşik Bağımlılık Enjektörler bölümde örnek geldi ise düzenleme için Ben bu konuda çok heyecanlıydıAngular2 dokümantasyon - Hiyerarşik Bağımlılık Enjektörler (Service Restore)

export class RestoreService<T> { 
    originalItem: T; 
    currentItem: T; 
setItem (item: T) { 
    this.originalItem = item; 
    this.currentItem = this.clone(item); 
} 
getItem() :T { 
    return this.currentItem; 
} 
restoreItem() :T { 
    this.currentItem = this.originalItem; 
    return this.getItem(); 
} 
clone (item: T) :T { 
    return JSON.parse(JSON.stringify(item)); 
} 
} 

yüzden kendim denedim:

Bu hizmettir! Öncelikle böyle değerleri ayarlıyorum: Bundan sonra

ngAfterContentInit(){ 
    this.metadata = { 
     languages: this.selected_languages, 
     countries: this.selected_countries, 
     international: false 
    } 
} 
set metadata(metadata: CvMetadata){ 
     this._restoreService.setItem(metadata); 
} 
get metadata(): CvMetadata{ 
    return this._restoreService.getItem(); 
} 

Ben mesela ngModel ile meta özelliklerinin değerlerini değiştirerek ediyorum: [(ngModel)]="metadata.languages[0]"

soru: Benim sruprise zaman için
Çalışır nugModel ile meta veri özellik değerini güncelleyin - currentItem değişti ve orginalItem sahip değil! Anlamadığım şey bu nasıl mümkün olabilir? Ben ngModel meta veri özelliklerini ayarlamak için setter kullanacağını düşündüm. Ancak asıl veriyi belirlediğimde setter sadece bir kez çağrılır. NgModel, sadece o orijinali değil, yalnızca o andaki durumu değiştireceğini biliyor mu? Bu kara büyü mü?

Biliyorum .. Sadece bunu açıklayacak birine ihtiyacım var, ama maalesef ya da neyse ki sadece siz varsınız!

Teşekkürler!

+0

'ngModel' metadata' nesnesinin kendisini ayarlamıyor/almıyor. Fakat 'diller [0]' öğesi. – Abdulrahman

+0

@Abdulrahman, bununla tartışamaz, ama bu benim karışıklığımın kaynağı değil. Sadece currentItem'i nasıl değiştirir .. ayrıca RestoreService bu işlevselliği nasıl sağlar? –

cevap

1

RestoreService: iki işlevi vardır setter ve getter;

setItem (item: T) setleri originalItem, klonlar o ve currentItem için klon kaydedin.

getItem() sadece

Şimdi ngModel onun özelliğini languages almak için öğeyi metadata alır currentItem (klonlanmış öğe) döndürür. Yani currentItem elde edecek. ngModel yeni bir özellik değeri belirttiğinde, set metadata()'a gerek yoktur. Yalnızca metadata'un içinde languages özelliğinin ayarlanması gerekir. Böylece, metadata yeniden alır ve languages özelliğini ayarlar. clone fonksiyonu üzerine

this.metadata = {language:['english']}; // you set metadata, effectively setting originalItem and cloning it to currentItem 

this.metadata.languages = ['arabic']; // you get metadata "currentItem", set its property languages. Never actually setting metadata itself 

Not: umarım

Here is a plunker

o

bunu açıklayan bir diğer yolu yardımcı olacaktırRestoreService yılında clone bir "pratik nesne klonlama değil işlevi "yol. Çünkü JSON ayrıştırıcı kullanıyor.Daha fazla bilgi ve daha iyi klonlama yaklaşımları için şu sorulara bakın: 122102, 728360

+0

Sadece test ettim ve haklısın! Bu, kafa karıştırıcı bir parçasıydı ... "bir şeylerin ayarlanması için alıcıyı kullanıyordu", ama bunu düşündüğümde, şimdi mükemmel bir anlam ifade ediyor. Açıklamak için tekrar teşekkürler! –

+0

@ ChakijsTerzētājs Çok hoş geldiniz. Yardım olmaktan memnun oldum. – Abdulrahman