Disclaimer: Tutte le tecniche riportate di seguito sono la mia esperienza con EmberJS negli ultimi mesi, oltre ad alcune discussioni con i miei colleghi. Qualunque cosa non sia corretta, per favore alza la voce. Siamo tutti in fase di apprendimento (e doc ember.js fa schifo al maxxx, quindi sii gentile;)
Attualmente ci sono due sviluppatori nel mio posto di lavoro che usano Ember.js. Siamo giunti alla conclusione che memorizzare le variabili globali nel globale ApplicationController
è molto meglio che archiviare nello spazio dei nomi dell'applicazione. Questo perché il recupero di questo valore potrebbe essere molto complicato se è memorizzato nello spazio dei nomi dell'applicazione. E questo funziona bene anche in chiusura, e quindi rendere il namespace globale pulito (e relativamente libero). Non vuoi che il tuo utente faccia App.set
a fare casino con la variabile vero?
Questo è basato su 1.0.0 pre-4.
si Considerando hanno questo currentUserId
variabile globale
Memorizzazione nello spazio dei nomi. jsFiddle demo
(function() {
function r() {
return Math.round(Math.random()*999);
}
var MyApp = Ember.Application.create({
currentUserId: null,
ready: function() {
//demo purpose.
this.set('currentUserId', r());
},
rootElement: '#demo'
});
MyApp.ApplicationView = Ember.View.extend({
templateName: 'application-view',
//Direct child view
innerView: Ember.View.extend({
templateName: 'inner-view',
setValue: function() {
this.set('controller.namespace.currentUserId', r());
}
}),
//Direct child view, but with a controller attached
innerViewWithController: Ember.View.extend({
controller: Ember.Controller.create(),
templateName: 'inner-view-with-controller',
setValue: function() {
this.set('parentView.controller.namespace.currentUserId', r());
}
}),
getValue: function() {
alert(this.get('controller.namespace.currentUserId'));
},
setValue: function() {
this.set('controller.namespace.currentUserId', r());
}
});
})();
vs conservazione in globale ApplicationController
jsFiddle demo
(function() {
function r() {
return Math.round(Math.random()*999);
}
var MyApp = Ember.Application.create({
ApplicationController: Ember.Controller.extend({
currentUserId: null,
init: function() {
//demo purpose
this.set('currentUserId', r());
}
}),
rootElement: '#demo'
});
MyApp.ApplicationView = Ember.View.extend({
templateName: 'application-view',
//Direct child view
innerView: Ember.View.extend({
templateName: 'inner-view',
setValue: function() {
this.set('controller.currentUserId', r());
}
}),
//Direct child view, but with a controller attached
innerViewWithController: Ember.View.extend({
controller: Ember.Controller.create(),
templateName: 'inner-view-with-controller',
setValue: function() {
this.set('parentView.controller.currentUserId', r());
}
}),
getValue: function() {
alert(this.get('controller.currentUserId'));
},
setValue: function() {
this.set('controller.currentUserId', r());
}
});
})();
Nota che:
Se si è scelto di memorizzare nella spazio dei nomi, è necessario accedervi tramite il controller di root per tutto il tempo, quindi è in realtà lo stesso di archiviazione in l'applicationController con una parola chiave extra namespace
.
Se si è scelto di memorizzare in radice applicationController
, per qualsiasi vista che scendono dal applicationView
, si può facilmente accedere alla variabile nei modelli con {{variableName}}
senza attraversamenti punti. Per impostazione predefinita, Ember.Js cerca variabili tramite i controller.
Nel caso peggiore, se la vista interna deve disporre di un proprio controllore, l'accesso alla variabile globale tramite controller principale (o spazio dei nomi) è leggermente più doloroso perché i controller non sono collegati, è necessario attraversare le visualizzazioni finché non vedi il controller di root. In Ember.JS, tutte le viste, per impostazione predefinita, avranno un set di controller e, per impostazione predefinita, il controller di un genitore. Il che significa che se non si specifica alcun controller, tutte le viste discendenti sono effettivamente collegate al controller principale. Per risolvere questo problema, è possibile eseguire binding obbligatorio nel controller per risolvere facilmente la bruttezza di attraversamento.
Io non suggerisco di mettere una variabile così importante nella window
oggetto globale come sarà facilmente modificato dall'utente (e solleva eventuali problemi). Mettere nel namespace globale nello spazio dei nomi dell'applicazione brace riduce il potenziale problema, ma non se ne fanno globale
I miei 2 centesimi;)
fonte
2013-02-13 04:24:37
almeno usare un oggetto 'user' come in' window.user =. ..'. – Reactormonk
È possibile memorizzare quello stato nell'istanza dell'applicazione. App = Ember.Application.create ({currentUser: null}). Imposta l'utente con App.set ("utente", utente) quando sei pronto. – mavilein
Memorizzo alcuni stati centrali nella mia app e funziona perfettamente. È un po 'puzzolente, ma a me sembra fattibile, se non si abusa troppo di questo approccio. – mavilein