Q:

Serverside validation of AngularJS forms, use $setValidity in the view controller? 

Or put in tl;dr code:
form.email.$setValidity('conflict', false);
is too sticky for my simple serverside validation flow. 
I'm trying to get the form to show good feedback in the event that the user enters an email address already in use by another customer.  I'm running AngularJS v1.2 and have this template:
<form name="form">
    <input name="email" type="email" ng-model="..." required>
</form>
<div ng-messages="form.email.$error">
    <div ng-message="conflict">Email address already in use.</div>
</div>

In my controller, I'll handle the submit event and trigger the validation in my $http.post().error handler like this:
$http.post('api/form/submit/path/here').error(function(resp) {
    if (resp.details === 'conflict')
        $scope.form.email.$setValidity('conflict', false);
});

The problem is that when the user goes back and changes the value in the input field, the error message doesn't go away.  It sticks around until I manually call $scope.form.setValidity();.  
The docs say implement a custom directive with an ng-model dependency, but that seems super overkill for my purposes.  I've also tried setting $scope.form.email.$valid = false; and $scope.form.email.$invalid = true; but those don't change the appearance of the textbox.  

A:

Nothing in your code modifies the conflict validation key, except for when $setValidity('conflict', false) is explicitly called.  Since that is the only code setting the state of the conflict validation key and there is nothing else resetting it to true, it's expected behaviour that editing the textbox wouldn't reset its conflict validation state. 
To get the behaviour that you want, you need to code for it.  One way is to use ng-change. 
<input name="email" type="email" ng-model="..." required ng-change="resetConflictState()">

$scope.resetConflictState = function() {
    $scope.form.email.$setValidity('conflict', true);
}

