home
  • Blog
1.10
  • Getting Started
    • Getting Started
    • Planning The Application
    • Creating a Static Mockup
    • Obtaining Ember.js and Dependencies
    • Adding the First Route and Template
    • Modeling Data
    • Using Fixtures
    • Displaying Model Data
    • Displaying a Model's Complete State
    • Creating a New Model Instance
    • Marking a Model as Complete or Incomplete
    • Displaying the Number of Incomplete Todos
    • Toggling between Showing and Editing States
    • Accepting Edits
    • Deleting a Model
    • Adding Child Routes
    • Transitioning to Show Only Incomplete Todos
    • Transitioning to Show Only Complete Todos
    • Transitioning back to Show All Todos
    • Displaying a Button to Remove All Completed Todos
    • Indicating When All Todos Are Complete
    • Toggling All Todos Between Complete and Incomplete
    • Replacing the Fixture Adapter with Another Adapter
  • Getting Ember
  • Concepts
  • The Object Model
  • Application
  • Templates
  • Routing
  • Components
  • Controllers
  • Models
  • Views
  • Enumerables
  • Testing
  • Configuring Ember.js
  • Cookbook
  • Understanding Ember.js
  • Contributing to Ember.js
Old Guides - You are viewing the guides for Ember v1.10.0.
Go to v5.0.0

Creating a New Model Instance

Edit pencil

Next we'll update our static HTML <input> to an Ember view that can expose more complex behaviors. Update index.html to replace the new todo <input> with an {{input}} helper:

{{! ... additional lines truncated for brevity ... }}
<h1>todos</h1>
{{input
  type="text"
  id="new-todo"
  placeholder="What needs to be done?"
  value=newTitle
  action="createTodo"}}
{{! ... additional lines truncated for brevity ... }}

This will render an <input> element at this location with the same id and placeholder attributes applied. It will also connect the newTitle property of this template's controller to the value attribute of the <input>. When one changes, the other will automatically update to remain synchronized.

Additionally, we connect user interaction (pressing the <enter> key) to a method createTodo on this template's controller.

Because we have not needed a custom controller behavior until this point, Ember.js provided a default controller object for this template. To handle our new behavior, we can implement the controller class Ember.js expects to find according to its naming conventions and add our custom behavior. This new controller class will automatically be associated with this template for us.

Add a js/controllers/todos_controller.js file. You may place this file anywhere you like (even just putting all code into the same file/), but this guide will assume you have created the file and named it as indicated.

Inside js/controllers/todos_controller.js implement the controller Ember.js expects to find according to its naming conventions:

Todos.TodosController = Ember.ArrayController.extend({
  actions: {
    createTodo: function() {
      // Get the todo title set by the "New Todo" text field
      var title = this.get('newTitle');
      if (!title.trim()) { return; }

      // Create the new Todo model
      var todo = this.store.createRecord('todo', {
        title: title,
        isCompleted: false
      });

      // Clear the "New Todo" text field
      this.set('newTitle', '');

      // Save the new model
      todo.save();
    }
  }
});

This controller will now respond to user action by using its newTitle property as the title of a new todo whose isCompleted property is false. Then it will clear its newTitle property which will synchronize to the template and reset the textfield. Finally, it persists any unsaved changes on the todo.

In index.html include js/controllers/todos_controller.js as a dependency:

<!--- ... additional lines truncated for brevity ... -->
   <script src="js/models/todo.js"></script>
   <script src="js/controllers/todos_controller.js"></script>
 </body>
 <!--- ... additional lines truncated for brevity ... -->

Reload your web browser to ensure that all files have been referenced correctly and no errors occur. You should now be able to add additional todos by entering a title in the <input> and hitting the <enter> key.

Live Preview

Ember.js • TodoMVC

Additional Resources

  • Changes in this step in diff format
  • Ember.TextField API documention
  • Ember Controller Guide
  • Naming Conventions Guide
left arrow
Displaying a Model's Complete State
Marking a Model as Complete or Incomplete
right arrow
On this page

  • Live Preview
  • Additional Resources
Team Sponsors Security Legal Branding Community Guidelines
Twitter GitHub Discord Mastodon

If you want help you can contact us by email, open an issue, or get realtime help by joining the Ember Discord.

© Copyright 2023 - Tilde Inc.
Ember.js is free, open source and always will be.


Ember is generously supported by
blue