typescript - Angular2- değişken ekleme tanımsız


Kendi infoWindow'ımı oluşturmaya çalışıyorum ve bunu bir Google Maps sınıfının ebeveynine ekliyorum. Fonksiyon şöyle görünüyor ve bir marker'a tıklanarak tetikleniyor:

updateDiv(location: Location) {
this.selectedLocation = location;
this.isClicked = true;
this.ID = this.selectedLocation.id;


console.log(this.ID)

$(function() {
   $('.gm-style-iw').parent().append('<div class="test"><span class="ID">'+ this.ID +'</span></div>');
 });
}

console.log tıklanan işaretçinin ID'sini gösteriyor, ancak div class='test' içinde tanımsız olarak görünüyor.

Bu neden?

Ya da HTML şablonunda oluşturduğunuz bir div'i eklemek de mümkün mü? Bu şöyle görünüyor:

<div *ngIf="isClicked" class="infoWindow">
   <p>{{ selectedLocation.id }} {{ selectedLocation.content }}</p>
</div>

Cevap #1

function() 'this'i yetim bırakır:

$(function() {
   $('.gm-style-iw').parent().append('<div class="test"><span class="ID">'+ this.ID +'</span></div>');
 });
}

yerine this kapsamını korumak için kullan

$(() => {
   $('.gm-style-iw').parent().append('<div class="test"><span class="ID">'+ this.ID +'</span></div>');
 });
}

Ayrıca bkz. https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Functions/Arrow_functions

Cevap #2

İki şey.

İlk olarak: Gunter'in belirttiği gibi, kapsam nedeniyle undefined alıyorsunuz. Ok fonksiyonları kullanmak probleminizi çözebilir.

İkincisi: Bence senin problemin için daha iyi bir çözüm innerHtml kullanmak olacaktır.

<div [innerHtml]="myHtml"></div>

Ve

myHtml: string;


constructor() {
  this.myHtml = '<input type="text">'
}

Güncelleme! OP zaten angular-maps bileşenini kullandığı için, en iyi çözüm zaten SebmGoogleMapInfoWindow ile mevcut.

Bileşen işaretlemesinin içine kendi HTML'inizi ekleyebilirsiniz:

<sebm-google-map-info-window>
  <div [innerHtml]="infoW" ></div>
</sebm-google-map-info-window>

Ve bileşen bir clickedMarker olayı sağladığı için. Bunu kendi özel HTML'inizi eklemek için kullanabilirsiniz:

clickedMarker(label: string, index: number) {
    this.infoW = '<input type="text" value="' + label  + '"> <hr> <button class="btn btn-success">Index = ' + index +  '</button>'      
  }

Tam örnek burada http://plnkr.co/edit/mG5cXP?p=preview