aboutsummaryrefslogtreecommitdiffstats
path: root/docs/cookbook.formadvanced.ngdoc
blob: 478358dbec066ba2b3d5a295cfddffa0d8f33316 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
@workInProgress
@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.