AngularJS Controllers in MVC Design: Creating a Shopping List

In the world of modern web development, the Model-View-Controller (MVC) architectural pattern has become a widely adopted approach for building scalable and maintainable applications. AngularJS, a popular JavaScript framework, embraces the MVC pattern and provides a structured way to organize your code. One of the key components in AngularJS is the controller, which acts as the intermediary between the model (data) and the view (user interface).

In this article, we'll explore the role of AngularJS controllers in the MVC design pattern, and we'll walk through an example of creating a simple shopping list application to illustrate their usage.

Understanding the MVC Pattern in AngularJS

The MVC pattern separates an application into three interconnected components:

  1. Model: Represents the data and the business logic of the application.
  2. View: Handles the presentation of the data to the user interface.
  3. Controller: Acts as the glue between the model and the view, facilitating data flow and managing user interactions.

In AngularJS, the MVC pattern is implemented as follows:

  • Model: Data and logic are typically encapsulated in services, factories, or custom JavaScript objects.
  • View: The HTML markup, along with AngularJS directives and data bindings, represents the view.
  • Controller: AngularJS controllers are responsible for managing the application logic and serving as the intermediary between the model and the view.

Creating a Shopping List with AngularJS Controllers

To illustrate the usage of AngularJS controllers, let's build a simple shopping list application. In this example, we'll create a controller that manages the list of items, allows users to add new items, and displays the current list.

Step 1: Set up the AngularJS Application

First, we need to create an AngularJS module and define a controller:

// app.js

var app = angular.module('shoppingListApp', []);


app.controller('ShoppingListController', function() {

  // Controller logic goes here


Step 2: Define the Controller Logic

Inside the ShoppingListController, we'll define the initial state of the shopping list and provide methods for adding and removing items:

app.controller('ShoppingListController', function() {

  var shoppingList = this;

  shoppingList.items = [];

  shoppingList.newItem = '';


  shoppingList.addItem = function() {

    if (shoppingList.newItem.trim()) {


      shoppingList.newItem = '';




  shoppingList.removeItem = function(index) {

    shoppingList.items.splice(index, 1);



In this controller, we define the following properties and methods:

  • items: An array that holds the current list of shopping items.
  • newItem: A string property used to store the user's input for a new item.
  • addItem(): A method that adds the newItem to the items array if it's not an empty string.
  • removeItem(index): A method that removes an item from the items array based on the provided index.

Step 3: Create the View

Next, we'll create the HTML markup for the view, which will display the shopping list and allow users to interact with it:

<!-- index.html -->

<!DOCTYPE html>

<html ng-app="shoppingListApp">


  <title>Shopping List</title>

  <script src=""></script>

  <script src="app.js"></script>


<body ng-controller="ShoppingListController as shoppingList">

  <h1>Shopping List</h1>

  <input type="text" ng-model="shoppingList.newItem" placeholder="Enter a new item">

  <button ng-click="shoppingList.addItem()">Add</button>



    <li ng-repeat="item in shoppingList.items">

      {{ item }}

      <button ng-click="shoppingList.removeItem($index)">Remove</button>





In this HTML markup, we:

  1. Include the AngularJS library and our app.js file.
  2. Use the ng-app directive to bootstrap the AngularJS application.
  3. Use the ng-controller directive to associate the ShoppingListController with the view.
  4. Bind the newItem property to an input field using ng-model.
  5. Use ng-click to call the addItem() method when the "Add" button is clicked.
  6. Use ng-repeat to iterate over the items array and display each item in a list.
  7. Provide a "Remove" button for each item, which calls the removeItem($index) method when clicked.

With this setup, our shopping list application is now functional. Users can enter new items, add them to the list, and remove existing items as needed.


1. What is the purpose of a controller in AngularJS?

The primary purpose of a controller in AngularJS is to manage the application logic and act as the intermediary between the model (data) and the view (user interface). Controllers are responsible for initializing data, handling user interactions, and updating the view accordingly.

2. Can a controller access and modify the DOM directly?

It is generally not recommended for AngularJS controllers to access or modify the DOM directly. Instead, controllers should focus on managing the application logic and data, while the view handles the presentation and rendering of that data. Manipulating the DOM directly can lead to code that is harder to maintain and test.

3. How can I share data between different controllers in AngularJS?

To share data between different controllers in AngularJS, you can:

  1. Use AngularJS services or factories to encapsulate and share data across controllers.
  2. Leverage the built-in event system in AngularJS ($broadcast, $emit, $on) to communicate between controllers.
  3. Use a shared parent scope or a root-level scope to expose data to multiple child controllers.

4. Can I nest controllers in AngularJS?

Yes, AngularJS allows you to nest controllers within other controllers. This can be useful when building complex user interfaces or managing hierarchical data structures. However, it's essential to follow best practices and maintain a clear separation of concerns to avoid tightly coupled and difficult-to-maintain code.

5. How can I unit test AngularJS controllers?

AngularJS provides built-in support for unit testing controllers using frameworks like Jasmine or Mocha. You can use the $controller service provided by AngularJS to create instances of your controllers in your tests and assert their behavior. Additionally, tools like Karma and Protractor can be used for end-to-end testing of AngularJS applications.

Share On