diff options
| author | Misko Hevery | 2011-02-02 17:46:01 -0800 | 
|---|---|---|
| committer | Misko Hevery | 2011-02-03 20:03:38 -0800 | 
| commit | 0d4def68ae0d95dd106d2731d60b6d6b635b5afc (patch) | |
| tree | 9c5eedf7a49cc33d4a8076787a13bc223d7826f7 /docs/cookbook.formadvanced.ngdoc | |
| parent | d35c1ac8b0bcd5df7a978fa2baee40be7ee317f3 (diff) | |
| download | angular.js-0d4def68ae0d95dd106d2731d60b6d6b635b5afc.tar.bz2 | |
added more cookbook: work in progress
Diffstat (limited to 'docs/cookbook.formadvanced.ngdoc')
| -rw-r--r-- | docs/cookbook.formadvanced.ngdoc | 78 | 
1 files changed, 78 insertions, 0 deletions
diff --git a/docs/cookbook.formadvanced.ngdoc b/docs/cookbook.formadvanced.ngdoc index 5b93b33e..478358db 100644 --- a/docs/cookbook.formadvanced.ngdoc +++ b/docs/cookbook.formadvanced.ngdoc @@ -2,3 +2,81 @@  @ngdoc overview  @name Cookbook: Advanced Form  @description + +Here we extend the basic form example to include common features such as reverting, dirty state detection, and preventing invalid form submission. + +<doc:example> + <doc:source> +    <script> +    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.master = this.form; +        this.cancel(); +        alert('SAVED: ' + angular.toJson(this.master)); +      } +    }; +    </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> + </doc:source> + <doc:scenario> + </doc:scenario> +</doc:example> + + +Things to notice + +Cancel & save buttons are only enabled if the form is dirty -- there is something to cancel or save. +Save button is only enabled if there are no validation errors on the form. +Cancel reverts the form changes back to original state. +Save updates the internal model of the form. +Debug view shows the two models. One presented to the user form and the other being the pristine copy master.  | 
