1. Installation and Setup
Install Ember CLI (Globally):
npm install -g ember-cli
Create a New Ember Project:
ember new my-ember-app cd my-ember-app ember serve
- Visit:
http://localhost:4200
2. Project Structure (Key Folders)
my-ember-app/ │ ├── app/ # Main app code │ ├── components/ # Reusable components │ ├── controllers/ # Controllers for routes │ ├── models/ # Data models (Ember Data) │ ├── routes/ # Route handlers │ ├── services/ # Shared logic/services │ ├── templates/ # Handlebars templates │ └── styles/ # CSS/SCSS styling │ ├── public/ # Static files ├── tests/ # Automated tests ├── config/ # Environment configuration └── package.json # Project dependencies
3. Running the Application
ember serve
- Development Server:
http://localhost:4200
4. Generating New Files
ember generate component my-component ember generate route about ember generate model user ember generate service auth
5. Creating a Route
Generate a Route:
ember generate route about
app/router.js:
import EmberRouter from '@ember/routing/router'; import config from './config/environment'; const Router = EmberRouter.extend({ location: config.locationType, rootURL: config.rootURL }); Router.map(function() { this.route('about'); }); export default Router;
app/routes/about.js:
import Route from '@ember/routing/route'; export default class AboutRoute extends Route { model() { return { message: 'Welcome to the About Page!' }; } }
app/templates/about.hbs:
<h1>{{model.message}}</h1>
6. Creating a Component
Generate Component:
ember generate component hello-world
app/components/hello-world.js:
import Component from '@glimmer/component'; export default class HelloWorldComponent extends Component { message = 'Hello from Ember!'; }
app/templates/components/hello-world.hbs:
<h1>{{this.message}}</h1>
Using the Component (in application.hbs):
<HelloWorld />
7. Template Syntax (Handlebars)
Dynamic Data Binding:
<h1>{{model.title}}</h1>
Conditional Rendering:
{{#if user.isLoggedIn}} <p>Welcome back!</p> {{else}} <p>Please log in.</p> {{/if}}
Looping (each):
<ul> {{#each this.items as |item|}} <li>{{item.name}}</li> {{/each}} </ul>
8. Actions (Event Handling)
<button {{on "click" this.sayHello}}>Click Me</button>
import Component from '@glimmer/component'; import { action } from '@ember/object'; export default class ButtonComponent extends Component { @action sayHello() { alert('Hello, Ember!'); } }
9. Two-Way Data Binding (@tracked)
import Component from '@glimmer/component'; import { tracked } from '@glimmer/tracking'; export default class CounterComponent extends Component { @tracked count = 0; @action increment() { this.count++; } }
<p>Count: {{this.count}}</p> <button {{on "click" this.increment}}>Increment</button>
10. Models (Ember Data)
Generate Model:
ember generate model user
app/models/user.js:
import Model, { attr } from '@ember-data/model'; export default class UserModel extends Model { @attr name; @attr email; }
11. Fetch Data from API (Model Hook)
import Route from '@ember/routing/route'; import { service } from '@ember/service'; export default class UsersRoute extends Route { @service store; model() { return this.store.findAll('user'); } }
12. Forms and Input Binding
<input type="text" value={{this.username}} {{on "input" this.updateName}}> <p>Your name: {{this.username}}</p>
import Component from '@glimmer/component'; import { tracked } from '@glimmer/tracking'; import { action } from '@ember/object'; export default class NameFormComponent extends Component { @tracked username = ''; @action updateName(event) { this.username = event.target.value; } }
13. Services (Global State Management)
Generate Service:
ember generate service auth
app/services/auth.js:
import Service from '@ember/service'; import { tracked } from '@glimmer/tracking'; export default class AuthService extends Service { @tracked isLoggedIn = false; login() { this.isLoggedIn = true; } }
Injecting Service (Component):
import Component from '@glimmer/component'; import { inject as service } from '@ember/service'; export default class NavbarComponent extends Component { @service auth; }
{{#if this.auth.isLoggedIn}} <p>Welcome User!</p> {{else}} <button {{on "click" this.auth.login}}>Login</button> {{/if}}
14. Helper Functions
ember generate helper capitalize
import { helper } from '@ember/component/helper'; export default helper(function capitalize([text]) { return text.toUpperCase(); });
<p>{{capitalize "hello ember"}}</p>
15. Testing (Ember QUnit)
ember test
- Run Specific Test:
ember test --filter="component:hello-world"
16. Useful Commands
ember serve # Start development server ember build # Build project ember test # Run tests ember generate route about # Generate route ember generate component nav # Generate component ember generate model post # Generate model
This cheat sheet covers essential topics to kickstart your Ember.js projects