You can update a scope by calling its $eval()
method, but usually
you do not have to do this explicitly. In most cases, angular intercepts all external events (such
as user interactions, XHRs, and timers) and calls the $eval()
method on the scope object for you
at the right time. The only time you might need to call $eval()
explicitly is when you create
your own custom widget or service.
The reason it is unnecessary to call $eval()
from within your controller functions when you use
built-in angular widgets and services is because a change in the data model triggers a call to the
$eval()
method on the scope object where the data model changed.
When a user inputs data, angularized widgets copy the data to the appropriate scope and then call
the $eval()
method on the root scope to update the view. It works this way because scopes are
inherited, and a child scope $eval()
overrides its parent's $eval()
method. Updating the whole
page requires a call to $eval()
on the root scope as $root.$eval()
. Similarly, when a request
to fetch data from a server is made and the response comes back, the data is written into the model
and then $eval()
is called to push updates through to the view and any other dependents.
A widget that creates scopes (such as ng:repeat
) is
responsible for forwarding $eval()
calls from the parent to those child scopes. That way, calling
$eval()
on the root scope will update the whole page. This creates a spreadsheet-like behavior
for your app; the bound views update immediately as the user enters data.