Свойство $pristine
не установлено в вашей модели ($ctrl.form
). На самом деле он установлен на ngFormController
. Однако для того, чтобы он был определен на вашем контроллере, вы должны определить имя формы в вашем теге формы, как показано ниже:
<form name="$ctrl.form">
<div class="form-group">
<label for="name">Name</label>
<input ng-model="$ctrl.model.name" class="form-control" id="name" name="name" type="text" />
</div>
</form>
Обратите внимание, что я изменил ng-model="$ctrl.form.name"
на ng-model="$ctrl.model.name"
, потому что модель отличается от контроллера формы. Поэтому ваша модель должна быть зарегистрирована где-то еще.
Кроме того, вы можете использовать <div ng-form="$ctrl.form">
, чтобы связать директиву ngForm
в элементе, отличном от form
.
Наконец, ngForm
свяжет ngFormController
с вашим контроллером (this
), чтобы вы могли иметь доступ к своему первоначальному состоянию внутри вашего контроллера, как в следующем фрагменте.
var _self = this;
_self.$postLink = function () {
angular.forEach(_self.form, function(value, key) {
if(key[0] == '$') return;
console.log(key, value.$pristine)
});
};
Обратите внимание, что я использовал хук _self.$postLink
, потому что форма будет готова только после того, как закончится фаза связи компонента (это означает, что потомок полностью связан с родителем, следовательно, postLink
).
Вы можете проверить полный рабочий фрагмент ниже:
angular.module('app', [])
.component('app', {
template: `
<form name="$ctrl.form">
<div class="form-group">
<label for="name">Name</label>
<input ng-model="$ctrl.model.name"
type="text"
class="form-control"
id="name"
name="name" />
</div>
</form>
`,
controller: function() {
var _self = this;
this.$postLink = function() {
angular.forEach(_self.form, function(value, key) {
if (key[0] == '$') return;
console.log(key, value.$pristine)
});
};
}
})
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.0/angular.js"></script>
<div ng-app="app">
<app></app>
</div>