Angular + Firebase = Chat App

Angular is a JavaScript framework and Firebase is a real-time database service. Put them together (with a tiny bit of glue code) and you, too, can have a fully functioning chat application.

First, a quick and dirty index.html file:

<html ng-app="app">
  <head>
    <script data-require="angular.js@1.4.0-rc.0" data-semver="1.4.0-rc.0" src="https://code.angularjs.org/1.4.0-rc.0/angular.js"></script>
    <script data-require="firebase@*" data-semver="2.2.2" src="//cdn.firebase.com/js/client/2.2.2/firebase.js"></script>
    <script data-require="angularfire@1.0.0" data-semver="1.0.0" src="//cdn.firebase.com/libs/angularfire/1.0.0/angularfire.min.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="script.js"></script>
  </head>
  <body ng-controller="MainCtrl as view">
    Name: <input type="text" ng-model="view.name"/><br><br>
    Message:<br>
    <textarea type="text" ng-model="view.text"></textarea><br>
    <button ng-click="view.addMessage(view.name, view.text)">Send</button>
    <button ng-click="view.clearAll()">Clear all messages</button>
    <hr />
    <p ng-repeat="message in view.messages"><strong>: </strong></p>
  </body>
</html>

In the <head> we’re pulling in Angular, Firebase and the AngularFire library.

The <body> is controlled by MainCtrl which is bound to the JavaScript using Angular’s “controller-as” syntax. There are a couple of buttons to add a message and to clear all the messages (though you probably wouldn’t want that one in production 😆).

Lastly, a single ng-repeat lists out all the messages.

Hardly any Angular code is needed. Just wire things up:

// Define the app
angular.module('app', ['firebase']);

// Main Controller
angular.module('app').controller('MainCtrl', MainCtrl);

MainCtrl.$inject = ['$scope', 'firebaseService'];

function MainCtrl($scope, firebaseService) {
  var view = this;
  view.name = "";
  view.from = "";
  view.messages = firebaseService.getMessages();
  view.addMessage = firebaseService.addMessage;
  view.clearAll = firebaseService.clearMessages;
}

// A simple service to wrap AngularFire
angular.module('app').factory('firebaseService', firebaseService);

firebaseService.$inject = ['$firebaseArray'];

function firebaseService($firebaseArray) {
  var messagesUrl = new Firebase("https://blistering-fire-2068.firebaseio.com/messages");
  var messages = $firebaseArray(messagesUrl);

  return {
    getMessages : getMessages,
    addMessage : addMessage,
    clearMessages : clearMessages
  };

  function getMessages() {
    return messages;
  }

  function addMessage(from, body) {
    from = from || "anon.";
    messages.$add({from: from, body: body});
  }

  function clearMessages() {
    messages.forEach(messages.$remove);
  }
}

The controller simply binds the firebaseService to the view. In a real app, your view probably has other things going on…

But that’s it. Try it:

Written on June 17, 2015