2016-05-15 45 views
28

işletilirse ben Angular2 en (RC1) HTTP Hizmet iki kez http.post çağrısı yapar garip sorunu karşılaştım. Uygulamamı ayıklarken hata buldum ve bunun bir tıklama olayı sorunu olmadığını biliyorum. Çekirdek servis çağrısıAngular2 http.post iki kez

public create(json: Object, params?: Object): Observable<T> { 
    let body = JSON.stringify([json]); 
    let headers = this.getHeaders(); 
    let options = new RequestOptions({ headers: headers }); 

    return this._http.post(this.createURL(this.getCreateURL(), [], params), body, options) 
    .map(res => this.handleObjectResponse(res)); 
} 

kadar yol Tüm aramalar kez çalıştırılır. Daha sonra, sorunu takip etmeye başladığımda, işleyici this.handleObjectResponse'un iki kez çalıştırıldığını öğrendim. Bu yüzden daha da kazarak, bu

constructor(req: Request, browserXHR: BrowserXhr, baseResponseOptions?: ResponseOptions) { 
    this.request = req; 
    this.response = new Observable<Response>((responseObserver: Observer<Response>) => { 
     let _xhr: XMLHttpRequest = browserXHR.build(); 
     _xhr.open(RequestMethod[req.method].toUpperCase(), req.url); 
     // load event handler 
     ... 
     .. 

Yani let _xhr: XMLHttpRequest = browserXHR.build(); üzerine daha sonra başka kesme noktası this.request = req; bir kesme noktası koymak ve yapılacak nereye @angular/http/src/backends/xhr_backend.ts ulaştı ve ben ilk kesme kez vurmak öğrendim ama sonra gelen ikinci kesme isabet iki kez geri arama. Ben angular2 iç yapıları aşina herkes bu yanlış yaptım bir hata ya da bir şey gibi görünüyor olmadığını ışık tutup tutamayacağını olmadığını kontrol etmek istedim

Bu beni çılgına olmuştur. GenericService ve FULLSERVICE GenericService uzanır:

Benim kodda bazı soyut genel hizmet sınıfları oluşturduk. Bunların ikisi de soyut ve kullanım jenerikleridir ve farklı bileşenlere enjekte edilen gerçek hizmet sınıflarının tümü GenericService veya FullService'dir. Bu kurulumun çift post infazdan sorumlu olabileceğini düşünüyor musunuz?

Tüm fikirler takdir edilmektedir!

Şimdiden teşekkürler!

P.S.

Bu ile olmaz alır ama aynı zamanda koyar ile olur.

+0

çağıran kodunu paylaşabilir miyim? belki birden bu durumda, gözlemlenebilir üzerinde abone var 'this._http.post (this.createURL (this.getCreateURL(), [], params), vücut, options) .map (res => this.handleObjectResponse dönmek (res)). share(); ' onu çözmelidir https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/share.md – teleaziz

+1

Kutsal saçmalık! Çok teşekkür ederim - bu gerçekten çözdü. Şimdi kafamı ilk başta yaptığım şeylerin etrafına sarmam gerek. Bunu bir cevap olarak göndermekten çekinmeyin, böylece bunu kabul edebilirim ve tekrar teşekkürler! – RVP

cevap

53

http hizmeti, executed on every subscribe olsun, soğuk bir gözlemlenebilir döndürür, onu yalnızca ilk abone üzerinde çalıştırılan ve sonraki aboneler için aynı değeri paylaşan sıcak gözlemlenebilir bir değere dönüştürmek istersiniz. Bunu yapmanız gereken tüm dönüştürmek için

o share: Ben bir formun giriş alanları birinde (key.enter)="someSubmitFunction()" sahip olduğundan bu bana da oluyordu

return this._http.post(this.createURL(this.getCreateURL(), [], params), body, options) 
.map(res => this.handleObjectResponse(res)) 
.share(); 
+1

Bu yorum aslında Angular2'nin son RC'sinde başka bir sorunu düzeltmeme yardımcı oldu. Teşekkürler dostum. Gözlemlenebilirler güzel bir kavram, ama içine girmek biraz zor. –

+3

Daha sonra "tricky" geriye doğru gidiyor, işleri daha da kötüleştiriyor, yani mükemmel çalışıyorsa, –

+3

düzgün çalışıyorlar. Bu yüzden, eğer bir metottan geri döndüğünüzde, bir http araması iyi bir uygulama yaptıktan sonra ALWAYS'ı hisse() –

0

. Bu alana girdiğimde, form iki kez gönderecekti. Görünüşe göre bu gerekli değildi. Bunu kaldırdığımda, form giriş yaptığımda, ancak şimdi yalnızca bir kez gönderilecek.

0
its happening because HTTP OPTIONS executed first, and you have to restrict unwanted HTTP method before executing your Logic, always use isset method,see example below 

if(isset($_POST)) 
{ 
    $name = $_POST["name"]; 
    $country = $_POST["country"]; 

    $sql = 'INSERT INTO user values("' . $name . '","' . $country . '")'; 

      if ($conn->query($sql)=== TRUE) 
      { 
       $outp = "Inserted " . $name . " and " . $country; 
       echo json_encode($outp); 
      } else { 
       echo json_encode("Error: " . $sql . "<br>" . $conn->error); 
      } 
     } 


here it will insert row in table only when its POST METHOD.