aboutsummaryrefslogtreecommitdiffstats
path: root/docs/content/guide/dev_guide.mvc.understanding_model.ngdoc
blob: 15d8bcb237a969ab1dd3e9b144ff11bae7f3bba0 (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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
@workInProgress
@ngdoc overview
@name Developer Guide: About MVC in Angular: Understanding the Model Component
@description


Depending on the context of the discussion in angular documentation, the term _model_ can refer to
either a single object representing one entity (for example, a model called "phones" with its value
being an array of phones) or the entire data model for the application (all entities).


In angular, a model is any data that is reachable as a property of an angular {@link
dev_guide.scopes Scope} object. The name of the property is the model identifier and the value is
any JavaScript object (including arrays and primitives).


The only requirement for a JavaScript object to be a model in angular is that the object must be
referenced by an angular scope as a property of that scope object. This property reference can be
created explicitly or implicitly.


You can create models by explicitly creating scope properties referencing JavaScript objects in the
following ways:


* Make a direct property assignment to the scope object in JavaScript code; this most commonly
occurs in controllers:


         function MyCtrl() {
             // create property 'foo' on the MyCtrl's scope
             // and assign it an initial value 'bar'
             this.foo = 'bar';
         }


* Use an {@link dev_guide.expressions angular expression} with an assignment operator in templates:


         <button ng:click="{{foos='ball'}}">Click me</button>


* Use {@link api/angular.directive.ng:init ng:init directive} in templates (for toy/example apps
only, not recommended for real applications):


         <body ng:init=" foo = 'bar' ">


Angular creates models implicitly (by creating a scope property and assigning it a suitable value)
when processing the following template constructs:


* Form input, select, and textarea elements:


         <input name="query" value="fluffy cloud">

   The code above creates a model called "query" on the current scope with the value set to "fluffy
cloud".


* An iterator declaration in {@link api/angular.widget.@ng:repeat ng:repeater}:


         <p ng:repeat="phone in phones"></p>


   The code above creates one child scope for each item in the "phones" array and creates a "phone"
object (model) on each of these scopes with its value set to the value of "phone" in the array.


In angular, a JavaScript object stops being a model when:


* No angular scope contains a property that references the object.


* All angular scopes that contain a property referencing the object become stale and eligible for
garbage collection.


The following illustration shows a simple data model created implicitly from a simple template:


<img src="img/guide/about_model_final.png">




## Related Topics


* {@link dev_guide.mvc About MVC in Angular}
* {@link dev_guide.mvc.understanding_controller Understanding the Controller Component}
* {@link dev_guide.mvc.understanding_view Understanding the View Component}