2012-08-27 15 views

risposta

5

Non è possibile, poiché Ember.js non fornisce alcun meccanismo di incapsulamento.

Tuttavia, è possibile utilizzare semplicemente alcune convenzioni per i membri privati. Ad esempio, li ha preceduti con il segno _.

+0

capito, grazie! interessante, gli autori di ember sono interessati ad impegnarsi con questo tipo di funzionalità. –

+1

Per i visitatori che arrivano qui dopo cinque anni, si prega di essere consapevoli che questa risposta (accettata) è sbagliata. –

0

Si potrebbe utilizzare una chiusura:

(function() { 
    var somePrivateProperty = 'xyz'; 

    MyObject = Em.Object.extend({ 
     someComputedProperty: function() { 
      return 'somePrivateProperty = ' + somePrivateProperty; 
     }).property() 
    }) 
})(); 
+0

sì, ma MyObject.get ('someComputedProperty') può essere utilizzato quasi ovunque –

+3

THIS non funzionerà, perché 'somePrivateProperty' sarà condiviso tra tutte le istanze. –

0

è possibile con un piccolo trucco:

var obj = Em.Em.Object.create(
    new function(){ 
     var privateVar = "this is private"; 
     this.getPrivateVar = function(){ 
      return privateVar ; 
     } 
    }, 
    { 
     emberVar: "Ember var", 
     emberMethod : function(){ 
      return this.getPrivateVar(); 
     }, 
     emberMethod1 : function(){ 
      return privateVar ; 
     }, 
     emberBinding : 'emberVar' 
    } 
) 

ora se U cercare di ottenere private var

obj.privateVar 
> unknown 

obj.getPrivateVar() 
> "this is private" 

obj.emberMethod() 
> "this is private" 

L'unico problema è quello:

obj.emberMethod1() 
> unknown 
+1

Questo non funziona, perché 'privateVar' sarà condiviso tra tutte le istanze. –

7

v'è infatti un modo per avere variabili private in oggetti Ember, come segue:

MyObject = Ember.Object.extend({ 
    init: function() { 
    // private variable 
    var a = 1; 

    // methods to get, set, or otherwise accesss the private variables 
    this.getA = function() {return a;}; 
    this.setA = function(val) {a = val;} 

    // don't forget this! 
    this._super(...arguments); 
    } 
}); 

Ora provate

o1 = MyObject.create() 
o2 = MyObject.create() 
o1.setA(42); 
o2.getA(); //1 

In altre parole, è necessario dichiarare le variabili private, e qualsiasi getter, setter o altre routine che vogliono usarli, nel gancio init. Ovviamente, ciò significa che quei getter/setter saranno presenti su ogni istanza della classe, piuttosto che nel suo prototipo. Questo è leggermente inefficiente, ma lo stesso vale per qualsiasi approccio alle variabili private per le classi in JavaScript.

È possibile che Ember possa introdurre un nuovo hash private: {} sugli oggetti, ma in tal caso Ember avrebbe bisogno di molti macchinari per gestire la ricerca e il controllo dell'accesso alle variabili private attraverso le gerarchie di classi. Sarebbe equivalente a ridisegnare o estendere la lingua stessa, che non fa parte della missione Ember.

Nel frattempo, l'approccio sopra riportato funziona correttamente se il numero di variabili di istanza private è limitato e il numero di routine che devono accedervi è ridotto. Quindi la risposta accettata che dice che questo è impossibile è, beh, sbagliato.

+1

Questo dovrebbe essere votato come è la risposta corretta, e ancora rilevante come di Ember 2.0 – Vassi

Problemi correlati