Могу ли я получить доступ к форме в контроллере?

В настоящее время я использую следующее.

$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.