Следующий код выдает ошибку "TypeError: Невозможно прочитать свойство" $pristine "из undefined", когда я нажимаю кнопку "Проверить".
app.controller('MainCtrl', function($scope) {
// other stuff
})
.controller('Ctrl2', function($scope) {
$scope.product = {description:'pump'};
$scope.output = 'unknown';
// uncomment to avoid undefined error, still can't see $pristine
// $scope.formHolder = {};
$scope.checkForm = function() {
$scope.descriptionTest = $scope.product.description;
if ($scope.formHolder.productForm.$pristine) {
$scope.output = 'yes';
}
if ($scope.formHolder.productForm.$dirty) {
$scope.output = 'no'
}
}
});
HTML
<body ng-controller="MainCtrl">
<div >
<ng-include ng-controller="Ctrl2" src="'myForm.html'"></ng-include>
</div>
</body>
myForm.html
<form name="productForm" novalidate>
<h2>myForm</h2>
description: <input type="text" name="description" ng-model="product.description"/>
<br>
<button ng-click="checkForm()">Check Form</button>
<br>
Form Pristine: {{output}}
<br><br>
I can see the description: {{descriptionTest}}
</form>
Проблема в том, что мой Ctrl2 не может видеть productForm. Сначала я думал, что это связано с прототипом, наследующим, что ng-include делает, когда он создает дочернюю область, поэтому я попытался добавить переменную в Ctrl2:
$scope.productForm = {};
Это избавило от этой ошибки, но мой контроллер все еще не правильно видел $чистые или грязные.
Я, наконец, получил его работу, добавив объект $scope.formHolder выше productForm:
.controller('Ctrl2', function($scope) {
$scope.product = {description:'pump'};
$scope.output = 'unknown';
// uncomment to avoid undefined error, still can't see $pristine
$scope.formHolder = {};
$scope.checkForm = function() {
$scope.descriptionTest = $scope.product.description;
if ($scope.formHolder.productForm.$pristine) {
$scope.output = 'yes';
}
if ($scope.formHolder.productForm.$dirty) {
$scope.output = 'no'
}
}
});
HTML
<form name="formHolder.productForm" novalidate>
Почему это работает? И есть ли лучший способ сделать это?
Я закончил так, потому что у меня была рабочая форма и контроллер/шаблон, которые я хотел бы использовать в другом месте. Я должен, вероятно, сделать директиву, но все отлично работало, кроме $первозданных и $грязных функций формы - все vg-модели vars прошли правильно.
Как я могу установить форму, содержащуюся внутри ng-include, чтобы быть престижной? имеет ответ, который "нарушает все правила", но казался более сложным.
Когда я пишу, когда форма Controller добавляет $pristine к области видимости и к какой области?
Изменить/Отклик:
Мой первоначальный вопрос можно свести к путанице о том, как директива формы записывает в область. У меня создалось впечатление, что это займет у нас
<form name="productForm">...
и добавить к нему свойства, например
$scope.productForm.$pristine = function() {...}
однако он пишет непосредственно поверх productForm:
$scope.productForm = formObject;
Итак, объект формы хранится в Ребенке, а не в родительском, как описано в выбранном ответе.
Ключевой самородок в наследовании дочерней области, который помог мне, заключается в том, что цепочку консультируют при чтении, но не пишут. Поэтому, если вы установите что-то вроде childScope.myThing.property = '123', в то время как это похоже на запись, сначала нужно сделать чтение, чтобы узнать, что такое myThing. Принимая во внимание, что установка childScope.myThing = '567' является прямой записью и не предполагает вообще смотреть на родительскую цепочку. Это лучше объясняется в: Каковы нюансы объема прототипа/прототипического наследования в AngularJS?