ng-view
ng-href
ng-class
ng-disabled
ng-showjavascript
index.htmlcss
<!doctype html> <html ng-app="project"> <head> <script src="js/angular.min.js"></script> <script src="js/angular-resource.min.js"> </script> <script src="js/angular-route.min.js"></script> </script> <script src="js/firebase.js"></script> <script src="js/angularfire.min.js"></script> <script src="project.js"></script> <script src="project-list.js"></script> <link rel="stylesheet" href="css/bootstrap-combined.min.css"> </head> <body> <h2>JavaScript Projects</h2> <div ng-view></div> </body> </html>
list.htmlhtml
<input type="text" ng-model="projectList.search" class="search-query" id="projects_search" placeholder="Search"> <table> <thead> <tr> <th>Project</th> <th>Description</th> <th><a href="#/new"><i class="icon-plus-sign"></i></a></th> </tr> </thead> <tbody> <tr ng-repeat="project in projectList.projects | filter:projectList.search | orderBy:'name'"> <td><a ng-href="{{project.site}}" target="_blank">{{project.name}}</a></td> <td>{{project.description}}</td> <td><a ng-href="#/edit/{{project.$id}}">edit</a></td> </tr> </tbody> </table>
detail.htmljava
<form name="myForm"> <div class="control-group" ng-class="{error: myForm.name.$invalid && !myForm.name.$pristine}"> <label>Name</label> <input type="text" name="name" ng-model="editProject.project.name" required> <span ng-show="myForm.name.$error.required && !myForm.name.$pristine" class="help-inline">Required {{myForm.name.$pristine}}</span> </div> <div class="control-group" ng-class="{error: myForm.site.$invalid && !myForm.site.$pristine}"> <label>Website</label> <input type="url" name="site" ng-model="editProject.project.site" required> <span ng-show="myForm.site.$error.required && !myForm.site.$pristine" class="help-inline">Required</span> <span ng-show="myForm.site.$error.url" class="help-inline">Not a URL</span> </div> <label>Description</label> <textarea name="description" ng-model="editProject.project.description"></textarea> <br> <a href="#/" class="btn">Cancel</a><br> <button ng-click="editProject.save()" ng-disabled="myForm.$invalid"class="btn btn-primary">Save</button><br> <button ng-click="editProject.destroy()"ng-show="editProject.project.$id" class="btn btn-danger">Delete</button> </form>
project.jsreact
angular.module('project', ['ngRoute', 'firebase']) .value('fbURL', 'https://ng-projects-list.firebaseio.com/') .service('fbRef', function(fbURL) { return new Firebase(fbURL) }) .service('fbAuth', function($q, $firebase, $firebaseAuth, fbRef) { var auth; return function () { if (auth) return $q.when(auth); var authObj = $firebaseAuth(fbRef); if (authObj.$getAuth()) { return $q.when(auth = authObj.$getAuth()); } var deferred = $q.defer(); authObj.$authAnonymously().then(function(authData) { auth = authData; deferred.resolve(authData); }); return deferred.promise; } }) .service('Projects', function($q, $firebase, fbRef, fbAuth, projectListValue) { var self = this; this.fetch = function () { if (this.projects) return $q.when(this.projects); return fbAuth().then(function(auth) { var deferred = $q.defer(); var ref = fbRef.child('projects-fresh/' + auth.auth.uid); var $projects = $firebase(ref); ref.on('value', function(snapshot) { if (snapshot.val() === null) { $projects.$set(projectListValue); } self.projects = $projects.$asArray(); deferred.resolve(self.projects); }); //Remove projects list when no longer needed. ref.onDisconnect().remove(); return deferred.promise; }); }; }) .config(function($routeProvider) { var resolveProjects = { projects: function (Projects) { return Projects.fetch(); } }; $routeProvider .when('/', { controller:'ProjectListController as projectList', templateUrl:'list.html', resolve: resolveProjects }) .when('/edit/:projectId', { controller:'EditProjectController as editProject', templateUrl:'detail.html', resolve: resolveProjects }) .when('/new', { controller:'NewProjectController as editProject', templateUrl:'detail.html', resolve: resolveProjects }) .otherwise({ redirectTo:'/' }); }) .controller('ProjectListController', function(projects) { var projectList = this; projectList.projects = projects; }) .controller('NewProjectController', function($location, projects) { var editProject = this; editProject.save = function() { projects.$add(editProject.project).then(function(data) { $location.path('/'); }); }; }) .controller('EditProjectController', function($location, $routeParams, projects) { var editProject = this; var projectId = $routeParams.projectId, projectIndex; editProject.projects = projects; projectIndex = editProject.projects.$indexFor(projectId); editProject.project = editProject.projects[projectIndex]; editProject.destroy = function() { editProject.projects.$remove(editProject.project).then(function(data) { $location.path('/'); }); }; editProject.save = function() { editProject.projects.$save(editProject.project).then(function(data) { $location.path('/'); }); }; });
project-list.jsjquery
angular.module('project').value('projectListValue', [ { name: 'AngularJS', site: 'http://angularjs.org', description: 'HTML enhanced for web apps!' }, { name: 'Angular', site: 'http://angular.io', description: 'One framework. Mobile and desktop.' }, { name: 'jQuery', site: 'http://jquery.com/', description: 'Write less, do more.' }, { name: 'Backbone', site: 'http://backbonejs.org/', description: 'Models for your apps.' }, { name: 'SproutCore', site: 'http://sproutcore.com/', description: 'A Framework for Innovative web-apps.' }, { name: 'Polymer', site: 'https://www.polymer-project.org/', description: 'Reusable components for the modern web.' }, { name: 'Spine', site: 'http://spinejs.com/', description: 'Awesome MVC Apps.' }, { name: 'Cappucino', site: 'http://www.cappuccino-project.org/', description: 'Objective-J.' }, { name: 'Knockout', site: 'http://knockoutjs.com/', description: 'MVVM pattern.' }, { name: 'GWT', site: 'http://www.gwtproject.org/', description: 'JS in Java.' }, { name: 'Ember', site: 'http://emberjs.com/', description: 'Ambitious web apps.' }, { name: 'React', site: 'https://facebook.github.io/react/', description: 'A JavaScript library for building user interfaces.' } ])