2016-03-25 11 views
1

yılında prototip işlevlerine bağımlılıkları geçmek? Özellikle AngularJS Services için. Bu aslında documentationnasıl prototip işlevlerinde bağımlılıkları (yani yapıcı parametreleri) erişmenin daha az ayrıntılı bir yolu var mı angularjs

function SomeClass(greeter) { 
    this.greeter = greeter; 
} 

SomeClass.prototype.doSomething = function(name) { 
    this.greeter.greet(name); 
} 

açıklanan resmi yoludur Ama bunun yerine ES2015 sınıfları sözdizimi kullanmak dikkate alacağını

function SomeSrvc($http, ...other deps...) { 
    var srvc = this; 

    // Verbose way of storing dependencies 
    srvc.$http = $http; 
    srvc.dep2 = dep2; 
    srvc.dep3 = dep3; 
    srvc.dep4 = dep4; 
} 

SomeSrvc.prototype.doSomething = function() { 
    var srvc = this; 
    // Do stuff with srvc.$http and other srvc.deps... 
}; 
+1

Ben böyle yapıyorum nasıl. JS'nin, nesnenin 'prototipini' sıkça kullanmama eğiliminde olmasının bir nedeni olabileceğini düşünüyorum. Ama biraz daha fazla vermese bile her zaman hoşuma gitti. – mgilson

+0

Sadece $ enjektör enjekte edebilirsin. – elclanrs

+0

@elclanrs Yukarıdaki örneği "$ injector" kullanarak gösterebilir misin? Prototip fonksiyonlara geçişin gerçek yolunu değiştirir mi? – lebolo

cevap

1

ben bir dış kapsamında prototip kullanarak kaçınarak ve basitçe kapanışları kullanmak olacağını biliyorum en kısa:

function SomeSrvc($http, ...other deps...) { 
    var srvc = this; 

    srvc.doSomething = function() { 
    // just use $http without this/srvc 
    }; 
} 

Kısa ve güzel. Eğer gerçekten prototip benzeri sözdizimi gibi, sadece girinti ayarlamak (ama bence bu çirkin olurdu) ise:

function SomeSrvc($http, ...other deps...) { 
    var srvc = this; 



srvc.doSomething = function() { 
    // Do stuff with srvc.$http and other srvc.deps... 
}; 

} 

Bu, aynı etkiyi verir - bu işlevi olacak bir new operatörü ile oluşturulan nesne ve açısal hizmetler bu şekilde oluşturulur.

Ayrıca, bu şekilde gerçekten iyi bir yan etkisi yoktur. Bu hizmet nesne üzerinde değişkenleri yaratmaz, bu yüzden hizmet için tüm değişkenleri atarken onlara public yapar ve başka açısal modülünden girilebildiği, private olarak kabul edilebilir. Şu anda servisinizi sadece enjekte ederek enjekte edilen tüm modülleri sadece ör. bağımlılık enjeksiyon fikrine tamamen karşıdır

SomeSrvc.$http 

.

hizmetler değil, kontrolörler için
+0

Teşekkürler, bu kesinlikle daha az verbose için soruya cevap veriyor. Daha önce kullanmayı düşündüm ama prototipik mirasını kaybetmek istemedim. – lebolo

+0

@lebolo Neden prototipik mirasa ihtiyacınız var? Açısal servisler singleton'lar, ** bir kez ** 'new' operatörüyle oluşturulur. Başka bir yerde kurucu işlevini yeniden kullanamazsınız, bu nedenle prototip artık geçersizdir. Benim düşünceme göre en azından ... – smnbbrv

+0

Daha önce kullanmıştım ([this] (http://blog.mgechev.com/2013/12/18/inheritance-services-controllers-in-angularjs/) bir örnek gösteriyor _module.service_ bölümünde). – lebolo

1

ait

Ben sadece biliyorum.

export default class SomeClass { 
    constructor(greeter) { 
    this._greeter = greeter; 
    } 

    doSomething() { 
    this._greeter.greet(name); 
    } 
} 

Bu konuda okuyabilirsiniz daha here

+0

Teşekkür atamak zorunda, belgelerde o bölümü kaçırdım! – lebolo

+2

Bu nasıl daha az ayrıntılı? – smnbbrv

+0

@smnbbrv Değil, ama bunu AngularJS'de yapmanın "resmi" yolu olduğunu bilmek yararlıdır. beni daha az bir budala gibi hissettiriyor = P açısal adamlar hala yerine kendi belgelerin çoğu sayfalarda bu şekilde '$ scope'-değişkenler yönlü kullanmak, ama buna gitmek için doğru yol olduğu anlamına gelmez @lebolo – lebolo

0

, biraz farklı bir şey yaptığını

module.factory('myService', function(dep1, dep2){ 
    var createInternal=function(){ 
     var internal = Object.create(proto); 
     internal.init(...); 
     return internal; 
    }; 
    var service = function(){ 
     var internal = createInternal(); 
     return { 
      doSomething: function(a, b, c){ return internal.doSomething(a,b,c); }, 
      ... 
     }; 
    }; 
    var proto = { 
     init: function(...){ 
        dep1.greet(); 
        dep2.doSomethingElse(); 
        ... 
       }, 
     doSomething: function(a, b, c){ 
        dep1.grito(b); 
        dep2.haceOtraCosa(); 
       }, 
     ... 
    }; 
    return service(); 
}); 

Bu biraz farklı, ama ben gibi, bir başlık ve prototip işlevlerin listesine ayırmaktır .

+0

daha az ayrıntılı gibi görünmüyor ... Bana spagetti benziyor; En az 20 satır kod kullandığınız bir hizmette boş bir işlev oluşturmak için ... – smnbbrv

+0

bana hizmetin ne yaptığını ya da prototip işlevlerinin ne yaptığını merak ediyorum ve bu yüzden çok fazla boilerplate var Ancak, kodun ilginç bölümleri bundan dolayı okumak daha kolaydır. – ryansstack

+0

En azından bu işlevlerden bazılarını özel bir servise koyabilir ve her yerde yeniden kullanabilirsiniz. Ben gerçekten bir tek bir satırda hizmetinizi önyükleme yapacak bazı harici işlevde bu şeylerin yarısını alabileceğine inanıyorum – smnbbrv