2016-04-14 19 views
-1

Hesaplanmış bir özelliğin içinde işlevinin() kullanılmasının neden işe yaradığını anlamaya çalışıyorum, ancak yağ oku yapmıyor.Bu, ember.js hesaplanmış özellikteki bir değeri nasıl tanımlanır?

Oluşturduğum bir sınıf ve hesaplanmış özelliklerin iki tanımı, biri function() {} (foo) içinden diğeri de () => {} çubuğundan geçiyor. Referans için de (foo1 ve bar1) de forEach() dizisine geçirilen iki stilde de yer verdim.

Birisi, bu dört örneğin her birinde neler olduğunu açıklayabilir mi? Burada

import Ember from 'ember'; 

const Light = Ember.Object.extend({ 
    isOn: false, 
    color: 'red', 

    foo: Ember.computed('isOn', 'color', function() { 
     console.log(`this in foo is ${this}`); 
    }) , 
    foo1: [1].forEach(function() { 
     console.log(`this in foo1 is ${this}`); 
    }) , 
    bar: Ember.computed('isOn', 'color', () => { 
     console.log(`this in bar is ${this}`); 
    }), 
    bar1: [1].forEach(() => { 
     console.log(`this in bar1 is ${this}`); 
    }) 

}); 

export default Ember.Controller.extend({ 
    appName: 'Ember Twiddle', 

    init() { 
    this._super(); 
    this.set('bulb', Light.create()); 
    } 

}); 

Tüm 4 özelliklere

<h1>Welcome to {{appName}}</h1> 
<br> 
<br> 
{{outlet}} 
<br> 
<br> 
<p> the bulb is {{bulb.isOn}} </p> 
<p> the bulb is {{bulb.foo}} </p> 
<p> the bulb is {{bulb.foo1}} </p> 
<p> the bulb is {{bulb.bar}} </p> 
<p> the bulb is {{bulb.bar1}} </p> 

ve burada konsola baskılı sonuçlardır başvuran şablondur. İşte

DEBUG: ------------------------------- 
VM66 ember.debug.js:6395 DEBUG: Ember  : 2.4.4 
VM66 ember.debug.js:6395 DEBUG: Ember Data : 2.4.3 
VM66 ember.debug.js:6395 DEBUG: jQuery  : 1.11.3 
VM66 ember.debug.js:6395 DEBUG: ------------------------------- 
VM70 about:srcdoc:29 this in foo1 is undefined 
VM70 about:srcdoc:35 this in bar1 is undefined 
VM70 about:srcdoc:26 this in foo is <(unknown mixin):ember360> 
VM70 about:srcdoc:32 this in bar is undefined 

muhtemelen bildiğiniz gibi link,

foo1: [1].forEach(function() { 
    console.log(`this in foo1 is ${this}`); 

fonksiyonları hesaplanmamış formun https://ember-twiddle.com/d5905b42eff57e8ad5c99a27a3199429?openFiles=templates.application.hbs%2C

cevap

3

Kişisel işlevlerini twiddle olduğu; ayrıştırma zamanında yürütülürler. forEach tarafından döndürülen değer undefined'dir. Bu nedenle, foo1 özelliğinin değeri undefined sabitidir. Light nesnesinin örneği oluşturulmadan önce, konsol günlüğü, tanım ayrıştırıldığında tam olarak bir kez gerçekleşir.

İşleviniz ok fonksiyonları sözcük this (çevrenin başka bir deyişle, this) çünkü

bar: Ember.computed('isOn', 'color', () => { 
    console.log(`this in bar is ${this}`); 
}), 

çalışmaz.veya window ya da undefined olması muhtemel olduğunda, this, this olacaktır. Ember, söz konusu nesnenin bağlamında (ile) hesaplanan özelliklerin bir parçası olarak belirtilen işlevleri çağırır, bu nedenle 'a eşit bir this olması kesinlikle işe yaramaz.

+0

Sanırım başkalarının neden çalışmadığını anlıyorum. Sanırım hala birazcık takılıyorum, bunun nedeninin “bu” nun bir şekilde Ember'in bağlamı olmadığına dair bir anlayışa sahip olmadığını anlamasıdır. – nPn

+0

@nPn 'function() {} .bind (this)' ile 'Ember.computed' arasında geçiş yapıyorsunuz, geçirdiğiniz içerik ya pencere ya da undefined (sıkı moda bağlı olarak), Light ember nesnesi henüz oluşturulmuş, yinelenen soruya bir göz atın. Eğer hala belirsiz ise, bizi özgür kunduz cemaatindeki -help veya -genel kanallarda bulabilirsiniz. –

+0

Ben _think_ Şimdi anlıyorum. Anahtar bilgi şu şekildedir: "Ember, hesaplanan özelliklerin bir parçası olarak belirtilen işlevleri söz konusu nesnenin bağlamıyla (bu ile) çağırır". Ember.computed kaynağına baktım ve orada bir uygulama() gördüm, bu yüzden böyle başarıldı. Muhtemelen böyle yaygın bir uygulamadır ('bu' sizin için doğru 'sağlamaya yardımcı olan çerçeveler), ama benim için (naif) Ben sadece _why_ çalıştı anlayamadım. Gevşek toplumun işaretçisi için teşekkürler. – nPn

İlgili konular