2016-07-08 16 views
5

Bunun bir kapsam sorunu olduğunu düşünüyorum, ancak bunu nasıl düzelteceğimi bilmiyorum. addContent baskılar ise nesne, http://jsfiddle.net/9k9Pe/1498/javascript ES6 sınıflarında 'this' döndürüyor undefined

class FrameCreator{ 

    constructor(){ 
     this.createFrame(); 
    } 
    createFrame(){ 
     var iframe = document.createElement('iframe'); 
     this.iframe = iframe; 
     var frameLoaded=this.frameLoaded; 
     iframe.onload = function() { 
        frameLoaded(); 
     }; 
     document.body.appendChild(iframe); 
    } 
    frameLoaded(){ 
      console.log("frame loaded"); 
    } 
} 

class CustomFrameCreator extends FrameCreator{ 
    addContent(){ 
      console.log(this); // returns the object 
    } 
    frameLoaded(){ 
      console.log(this); // returns undefined 
    } 
} 

var frame=new CustomFrameCreator(); 
frame.addContent(); 

frameLoaded() baskılar tanımsız: İşte benim kodudur.

Bunu nasıl düzeltebilirim, böylece çerçeve yüklendiğinde bu konuda bir referans alabilir miyim?

Teşekkür

+2

class FrameCreator { constructor() { this.createFrame(); } createFrame() { var iframe = document.createElement('iframe'); this.iframe = iframe; var frameLoaded = this.frameLoaded; iframe.onload = frameLoaded.bind(this) document.body.appendChild(iframe); } frameLoaded() { console.log("frame loaded"); } } class CustomFrameCreator extends FrameCreator { addContent() { console.log(this); // returns the object } frameLoaded() { console.log(this); // returns undefined } } var frame = new CustomFrameCreator(); frame.addContent();

deneyin 'iframe.onload =() => this.frameLoaded();' –

+1

'var frameLoaded = this.frameLoaded;' başlayanlar için, bunu yapma. veya en azından bağla. –

+0

"iframe.onload" adresinde hangi "frameLoaded" yöntemini çalıştırmak istediğiniz ve hangi "value" değerine sahip olduğu net değil. – Oriol

cevap

9

başka alternatif için işleyici bağlamak gerekir fiddle

+0

Bu, işlevi çağıran bir işlev oluşturur. Bağlanma kadar verimli olmadığından şüpheleniyorum. Yine de emin değilim. – frodeborli

+0

@frodeborli 'bind()' işlevi dahili olarak sarar, yine de bu polfill'i nasıl uygularsınız. Bunu daha az verimli kılan bölüm aslında işlev kapsamı üzerinde bazı JavaScript optimizasyon potansiyelini öldüren "bu" için atıf yapılan referanstır, bu yüzden kısmen doğru olursunuz, ancak yanlış sebepten dolayı. –

4

Kullanım bind fonksiyon bağlam

this.frameLoaded.bind(this); 

Sen onload

iframe.onload = function() { 
    this.frameLoaded(); 
}.bind(this); 
0

Bkz bağlamak

iframe.onload =() => { 
    this.frameLoaded(); 
}; 

class FrameCreator { 
 
    constructor() { 
 
    this.createFrame(); 
 
    } 
 
    
 
    createFrame() { 
 
    var iframe = document.createElement('iframe'); 
 
    this.iframe = iframe; 
 
    
 
    iframe.onload =() => { 
 
     this.frameLoaded(); 
 
    }; 
 

 
    document.body.appendChild(iframe); 
 
    } 
 
    
 
    frameLoaded() { 
 
    console.log("frame loaded"); 
 
    } 
 
} 
 

 
class CustomFrameCreator extends FrameCreator { 
 
    addContent() { 
 
    console.log(this); // returns the object 
 
    } 
 
    frameLoaded() { 
 
    console.log(this); // returns the object now 
 
    } 
 
} 
 

 
var frame = new CustomFrameCreator(); 
 
frame.addContent();

0

Eğer sınıfını başvuru yapmıyor onload callback'inde içinde yeni kapsam, this oluşturduğunuz için, bunun yerine referansları:bağlam korumak için ES6 Ok işlevini kullanmaktır geri arama işlevi kendisi. Doğru buArg için bindframeLoaded yöntemini kullanmalısınız.

İlgili konular