Actualmente estoy usando lo siguiente.
$scope.$$childHead.customerForm[firstName]
, así que eso:
<form name="customerForm">
<input type="text" name="firstName"
ng-model="data.customer.firstName"
tabindex="1"
ng-disabled="!data.editable"
validationcustomer />
</form>
Pero esto solo funciona en Chrome. Ahora probé lo siguiente:
$scope.editCustomerForm[firstName]
, así que eso:
<form name="customerForm" ng-model="editCustomerForm">
<input type="text" name="firstName"
ng-model="data.customer.firstName" tabindex="1"
ng-disabled="!data.editable"
validationcustomer />
</form>
Lo que no funciona. Tenga en cuenta que mi formulario está dentro de una pestaña de Fundación. ¿Cómo puedo acceder firstName
?
EDITAR : Parece que form
no se agrega a scope
cuando está dentro de una pestaña de Fundación.
¿Alguien tiene una solución para esto?
Puede adjuntar el formulario a algún objeto que se define en un controlador principal. Entonces puede alcanzar su formulario incluso desde un ámbito secundario.
Controlador principal
Alguna plantilla en un ámbito secundario
El problema es que el formulario no tiene que definirse en el momento en que se ejecuta la codificación en el controlador. Entonces tienes que hacer algo como esto
fuente
var watcher = $scope.$watcher
y dentro de la declaración if que ejecutarías watcher () para desvincular el reloj. Esto lo convierte en un reloj de unaSi desea pasar el formulario al controlador para fines de validación, simplemente puede pasarlo como argumento al método que maneja el envío. Use el nombre del formulario, por lo que para la pregunta original sería algo como:
fuente
<form name="myform"></form>
, o incluso<div ng-form name="myform"></div>
, a continuación, su evento click sería de la siguiente manera:ng-click="submit(myform)"
. Luego puede acceder al objeto de forma angular en su función de clic como:$scope.submit = function (form) { if (form.$valid) {
etc.Un poco tarde para una respuesta, pero vino con la siguiente opción. Me está funcionando, pero no estoy seguro de si es la forma correcta o no.
En mi opinión, estoy haciendo esto:
Y en el controlador:
Ahora, después de hacer esto, tengo mi formulario en la variable de mi controlador, que es
$scope.myForm
fuente
name
atributo sea exactamente lo que quiero que sea. El problema con las otras soluciones de objeto ficticio es que si este componente se usa en otro componente con una forma ng, esa otra forma ng usa este nombre de formas literalmente. Por lo tanto, tendrá un campo con un nombre de cadena literal (NO propiedades anidadas) de "dummy.myForm", encontré esto inaceptable.Para poder acceder al formulario en su controlador, debe agregarlo a un objeto de alcance ficticio.
Algo como
$scope.dummy = {}
Para su situación, esto significaría algo como:
En su controlador podrá acceder al formulario de la siguiente manera:
y podrás hacer cosas como
WIKI LINK
fuente
dummy.customerForm
será indefinido hasta que las condiciones deng-if
que se cumplan caso de que el elemento de formulario tienen unang-if
condicionada a queEsta respuesta llega un poco tarde, pero me topé con una solución que hace que todo sea MUCHO más fácil.
En realidad, puede asignar el nombre del formulario directamente a su controlador si está utilizando la sintaxis de controllerAs y luego hacer referencia a él desde su variable "this". Así es como lo hice en mi código:
Configuré el controlador a través del enrutador ui (pero puedes hacerlo como quieras, incluso en el HTML directamente con algo así
<div ng-controller="someController as myCtrl">
) Esto es lo que podría parecer en una configuración de enrutador ui:y luego en el HTML, simplemente configura el nombre del formulario como "controllerAs". "name" de esta manera:
ahora dentro de su controlador puede simplemente hacer esto:
fuente
Sí, puede acceder a un formulario en el controlador (como se indica en los documentos ).
Excepto cuando su formulario no está definido en el ámbito del controlador y en su lugar se define en un ámbito secundario.
Básicamente, algunas directivas angulares, como
ng-if
,ng-repeat
ong-include
, crearán un ámbito secundario aislado. También lo harán las directivas personalizadas con unascope: {}
propiedad definida. Probablemente, sus componentes básicos también están en su camino.Tuve el mismo problema al introducir un simple
ng-if
alrededor de la<form>
etiqueta.Ver estos para más información:
https://groups.google.com/forum/#!topic/angular/B2uB8-9_Xbk
AngularJS: pérdida de alcance cuando se usa ng-include
Nota: le sugiero que vuelva a escribir su pregunta. La respuesta a su pregunta es sí, pero su problema es ligeramente diferente:
A lo que la respuesta sería simplemente: no .
fuente
$scope.forms = {}
yname="forms.form1"
)agregue
ng-model="$ctrl.formName"
atributo a su formulario, y luego en el controlador puede acceder al formulario como un objeto dentro de su controlador althis.formName
fuente
Definitivamente no puede acceder al formulario en el ámbito bec. No es creado. La plantilla DOM de html se carga un poco lentamente como el constructor del controlador. ¡la solución es mirar hasta que DOM se cargue y se defina todo el alcance!
en el controlador:
fuente