--- /dev/null
+<script>
+angular.service('conference', function($resource){
+ this.User = $resource( '/data/conference/User/' );
+}, {$inject:['$resource'],$creation:'eager'});
+
+function UserForm(){
+ this.master = {
+ name: 'John Smith',
+ address:{
+ line1: '123 Main St.',
+ city:'Anytown',
+ state:'AA',
+ zip:'12345'
+ },
+ contacts:[
+ {type:'phone', value:'1(234) 555-1212'}
+ ]
+ };
+ this.cancel();
+}
+
+UserForm.prototype = {
+ cancel: function(){
+ this.form = angular.copy(this.master);
+ },
+
+ save: function(){
+ this.saved = new this.User( this.form );
+ this.saved.$save();
+ console.debug( 'saved', this.saved );
+ this.form = this.saved;
+ }
+};
+</script>
+<div ng:controller="UserForm">
+
+ <label>Name:</label><br/>
+ <input type="text" name="form.name" ng:required/> <br/><br/>
+
+ <label>Address:</label><br/>
+ <input type="text" name="form.address.line1" size="33" ng:required/> <br/>
+ <input type="text" name="form.address.city" size="12" ng:required/>,
+ <input type="text" name="form.address.state" size="2" ng:required ng:validate="regexp:/^\w\w$/"/>
+ <input type="text" name="form.address.zip" size="5" ng:required ng:validate="regexp:/^\d\d\d\d\d$/"/><br/><br/>
+
+ <label>Phone:</label>
+ [ <a href="" ng:click="form.contacts.$add()">add</a> ]
+ <div ng:repeat="contact in form.contacts">
+ <select name="contact.type">
+ <option>email</option>
+ <option>phone</option>
+ <option>pager</option>
+ <option>IM</option>
+ </select>
+ <input type="text" name="contact.value" ng:required/>
+ [ <a href="" ng:click="form.contacts.$remove(contact)">X</a> ]
+ </div>
+<button ng:click="cancel()" disabled="{{master.$equals(form)}}">Cancel</button>
+<button ng:click="save()" disabled="{{$invalidWidgets.visible() || master.$equals(form)}}">Save</button>
+
+<hr/>
+Debug View:
+<pre>form={{form}}
+master={{master}}</pre>
+</div>