Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
582 views
in Technique[技术] by (71.8m points)

ember.js - Access a global variable from any app controller

I need to use a global variable (user context, available from all the code) I have read some posts regarding this topic but I do not have a clear answer.

App = Ember.Application.create({
  LOG_TRANSITIONS: true,
  currentUser: null
});
  1. Is it a good practice to set the currentUser global variable in the App object ?
  2. How to update and access the currentUser property from all the controllers used in the app ?
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Is it a good practice to set the currentUser global variable in the App object ?

No, this is not a good practice. You should avoid using global variables. The framework does a lot to make this possible - if you find yourself thinking a global variable is the best solution it's a sign that something should be refactored. In most cases the right place is in a controller. For example, currentUser could be:

//a property of application controller
App.ApplicationController = Ember.Controller.extend({
  currentUser: null
});

//or it's own controller
App.CurrentUserController = Ember.ObjectController.extend({});

How to update and access the currentUser property from all the controllers used in the app ?

Use the needs property. Let's say you've declared currentUser as a property of ApplicationController. It can be accessed from PostsController like this:

App.PostsController = Ember.ArrayController.extend{(
  needs: ['application'],
  currentUser: Ember.computed.alias('controllers.application.currentUser'),
  addPost: function() {
    console.log('Adding a post for ', this.get('currentUser.name'));
  }
)}

If you need to access currentUser from a view/template, just use needs to make it accessible via the local controller. And if you need it from a route, use the route's controllerFor method.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...