Могу ли я получить доступ к форме в контроллере?
В настоящее время я использую следующее.
$scope.$$childHead.customerForm[firstName]
, так что:
<form name="customerForm">
<input type="text" name="firstName"
ng-model="data.customer.firstName"
tabindex="1"
ng-disabled="!data.editable"
validationcustomer />
</form>
Но это работает только в Chrome. Теперь я попробовал следующее:
$scope.editCustomerForm[firstName]
, так что:
<form name="customerForm" ng-model="editCustomerForm">
<input type="text" name="firstName"
ng-model="data.customer.firstName" tabindex="1"
ng-disabled="!data.editable"
validationcustomer />
</form>
Что не работает. Обратите внимание, что моя форма находится внутри вкладки Foundation. Как я могу получить доступ к firstName
?
EDIT. Похоже, что form
не добавляется к scope
, когда он находится внутри вкладки Foundation.
У кого-то есть решение для этого?
Ответы
Ответ 1
Несмотря на то, что в других комментариях я ссылался, я подумал, что немного описал это для тех, кто использует синтаксис "Контроллер как":
<div ng-controller="MyController as ctrl">
<form name="ctrl.myForm">
...inputs
Dirty? {{ctrl.myForm.$dirty}}
<button ng-click="ctrl.saveChanges()">Save</button>
</form>
</div>
Затем вы можете получить доступ к FormController в своем коде, например:
function MyController () {
var vm = this;
vm.saveChanges = saveChanges;
function saveChanges() {
if(vm.myForm.$valid) {
// Save to db or whatever.
vm.myForm.$setPristine();
}
}
Ответ 2
Вы можете прикрепить форму к некоторому объекту, который определен в родительском контроллере. Затем вы можете достигнуть своей формы даже из детского пространства.
Родительский контроллер
$scope.forms = {};
Некоторые шаблоны в области содержимого
<form name="forms.form1">
</form>
Проблема заключается в том, что форма не должна определяться в момент выполнения кода в контроллере. Итак, вы должны сделать что-то вроде этого
$scope.$watch('forms.form1', function(form) {
if(form) {
// your code...
}
});
Ответ 3
Если вы хотите передать форму контроллеру для целей проверки, вы можете просто передать его в качестве аргумента методу обработки представления. Используйте имя формы, поэтому для исходного вопроса это будет примерно так:
<button ng-click="submit(customerForm)">Save</button>
Ответ 4
Бит опоздал на ответ, но появился следующий вариант. Он работает для меня, но не уверен, что это правильный способ или нет.
На мой взгляд, я делаю это:
<form name="formName">
<div ng-init="setForm(formName);"></div>
</form>
И в контроллере:
$scope.setForm = function (form) {
$scope.myForm = form;
}
Теперь после этого у меня есть моя форма в моей переменной-контроллере, которая $scope.myForm
Ответ 5
Чтобы иметь доступ к форме в вашем контроллере, вы должны добавить ее в объект фиктивной области.
Что-то вроде $scope.dummy = {}
В вашей ситуации это будет означать что-то вроде:
<form name="dummy.customerForm">
В вашем контроллере вы сможете получить доступ к форме:
$scope.dummy.customerForm
и вы сможете делать такие вещи, как
$scope.dummy.customerForm.$setPristine()
WIKI LINK
Наличие символа '.' в ваших моделях будет гарантировать, что прототипное наследование в игре. Итак, используйте <input type="text" ng-model="someObj.prop1">
скорее чем <input type="text" ng-model="prop1">
Если вам действительно нужно/нужно использовать примитив, есть два способа:
1.Используйте $parent.parentScopeProperty в области содержимого. Это предотвратит сфера ребенка от создания собственного имущества. 2. Определите функцию на родительскую область и вызвать ее из дочернего элемента, передав примитив значение до родителя (не всегда возможно)
Ответ 6
Этот ответ немного запоздал, но я наткнулся на решение, которое облегчает все.
Фактически вы можете присвоить имя формы своему контроллеру, если вы используете синтаксис controllerAs, а затем ссылаетесь на него с помощью переменной "this". Вот как я это сделал в своем коде:
Я сконфигурировал контроллер через ui-router (но вы можете сделать это, как хотите, даже в HTML напрямую с чем-то вроде <div ng-controller="someController as myCtrl">
). Это то, что может выглядеть в конфигурации ui-router:
views: {
"": {
templateUrl: "someTemplate.html",
controller: "someController",
controllerAs: "myCtrl"
}
}
а затем в HTML, вы просто устанавливаете имя формы как "controllerAs". "name" следующим образом:
<ng-form name="myCtrl.someForm">
<!-- example form code here -->
<input name="firstName" ng-model="myCtrl.user.firstName" required>
</ng-form>
теперь внутри вашего контроллера вы можете очень просто сделать это:
angular
.module("something")
.controller("someController",
[
"$scope",
function ($scope) {
var vm = this;
if(vm.someForm.$valid){
// do something
}
}]);
Ответ 7
Да, вы можете получить доступ к форме в контроллере (как указано в docs).
За исключением случаев, когда ваша форма не определена в области контроллера и определена в области дочерних элементов.
В принципе, некоторые директивы angular, такие как ng-if
, ng-repeat
или ng-include
, создадут изолированный дочерний объект. Так будут заданы любые пользовательские директивы с определенным свойством scope: {}
. Вероятно, ваши базовые компоненты также на вашем пути.
У меня была такая же проблема при введении простого ng-if
вокруг тега <form>
.
Смотрите их для получения дополнительной информации:
Примечание: Я предлагаю вам переписать свой вопрос. Ответ на ваш вопрос да, но ваша проблема несколько отличается:
Можно ли получить доступ к форме в дочерней области с контроллера?
Для чего ответ будет просто: нет.
Ответ 8
Определенно, вы не можете получить доступ к форме в сфере видимости. он не создается. DOM из html-шаблона загружается немного медленно, как конструктор контроллера.
решение должно смотреть до тех пор, пока DOM не загрузится и не будет определена вся область!
в контроллере:
$timeout(function(){
console.log('customerForm:', $scope.customerForm);
// everything else what you need
});
Ответ 9
Да, вы можете получить доступ к своему контроллеру с помощью this.formname.