Awesome
todo-ng2now
ToDo app coded using the Angular2-now library and with AngularJS 1.3 and angular-meteor.
Click here for the demo.
Comparing angular2-now and Aurelia
After reading Porting an Angular 2.0 App to Aurelia I was inspired to do a side by side comparison of angular2-now and Aurelia. I wanted to see just how much more code, if any, I would be forced to write with AngularJS 1.3, angular2-now and angular-meteor.
Notice: For comparison, I have copied the Aurelia code samples from the abovementioned blog.
So, this is not an extensive review with commentary, etc. Just a side by side code and HTML.
The App itself
app.js
<table> <thead> <tr> <th> angular2-now<br> </th> <th> Aurelia<br> </th> </tr> </thead> <tr> <td> <pre> angular.extend(window, angular2now); angular2now.options({ controllerAs: 'vm' })angular.module('todo-app', ['angular-meteor']);
@Component({ selector: 'todo-app' }) @View({ templateUrl: 'client/components/app.html' }) class TodoApp { }
bootstrap(TodoApp); </pre> </td> <td>
<pre> export class TodoApp {} </pre></td>
</tr>
</table>
app.html
Angular2-now
<div>
<todo-list></todo-list>
<new-item></new-item>
</div>
Aurelia
<template>
<require from="./todo-list"></require>
<require from="./new-item"></require>
<todo-list></todo-list>
<new-item></new-item>
</template>
todo-list
todo-list.js
<table> <thead> <tr> <th> angular2-now<br> </th> <th> Aurelia<br> </th> </tr> </thead> <tr> <td> <pre> @Component({ selector: 'todo-list', injectables: ['todoItems'] }) @View({ templateUrl: 'client/components/todo-list.html' })class TodoList { constructor(todoItems) { this.items = todoItems; } completeAll() { this.items.forEach( item => item.completed = true ); } removeItem(item) { this.items.splice(this.items.indexOf(item), 1); } } </pre> </td> <td>
<pre> import {TodoItems} from 'services/todo-items'; export class TodoList { static inject = [TodoItems]; constructor(todoitems) { this.items = todoitems.items; } completeAll() { this.items.forEach(item => item.completed = true); } removeItem(item) { this.items.splice(this.items.indexOf(item), 1); } } </pre></td>
</tr>
</table>
todo-list.html
Angular2-now
<div style="margin-bottom:10px">
<h1>To Do</h1>
<div style="padding:5px" ng-repeat="item in vm.items">
<input type="checkbox" ng-model="item.completed"/> {{ item.text }}<a ng-click="vm.removeItem(item)" class="glyphicon glyphicon-remove"></a>
</div>
<button ng-if="vm.items.length > 1" ng-click="vm.completeAll()" class="btn btn-xs btn-warning">Complete All</button>
</div>
Aurelia
<template style="margin-bottom:10px">
<h1>To Do</h1>
<div style="padding:5px" repeat.for="item of items">
<input type="checkbox" checked.bind="item.completed" />
${item.text} <a class="glyphicon glyphicon-remove" click.trigger="$parent.removeItem(item)"></a>
</div>
<button if.bind="items.length" class="btn btn-xs btn-warning" click.trigger="completeAll()">Complete All</button>
</template>
New-Item
Angular2-now version is shorter here. I optimised the HTML for Angular 1.3, which makes two way binding a bit easier than the Angular 2 version.
new-item.js
<table> <thead> <tr> <th> angular2-now<br> </th> <th> Aurelia<br> </th> </tr> </thead> <tr> <td> <pre> @Component({ selector: 'new-item', injectables: ['todoItems'] }) @View({ templateUrl: 'client/components/new-item.html' })class NewItem { constructor(todoItemList) { this.items = todoItemList } addItem() { this.items.push({ text: this.input, completed: false }) this.input = ''; } } </pre> </td> <td>
<pre> import {TodoItems} from 'services/todo-items'; export class NewItem { static inject = [TodoItems]; constructor(todoitems) { this.items = todoitems.items; } keyPressed($event) { if($event.which === 13) { this.addItem(this.value); } } addItem(input) { this.items.push({ text: this.value, completed: false }) this.value = ''; } } </pre></td>
</tr>
</table>
new-item.html
Angular2-now
<form ng-submit="vm.addItem()" class="form-inline">
<div class="form-group">
<label for="description">New Item</label>
<input id="description" type="text" ng-model="vm.input" class="form-control"/>
</div>
<button type="submit" class="btn btn-primary">Add Item</button>
</form>
Aurelia
<template>
<div class="form-inline">
<div class="form-group">
<label for="description">New Item</label>
<input id="description" class="form-control" value.bind="value" keyup.trigger="keyPressed($event)">
</div>
<button class="btn btn-primary" type="button" click.trigger="addItem()">Add Item</button>
</div>
</template>
Summary
From the above short examples, it would appear that you can write nice, short code with AngularJS 1.3 and Angular2-now.