Reputation: 21326
I am using an Angular 1.5 Material Design $mdDialog
in the recommended way, using controllerAs: "dialog"
. In the template I have a form: <form name="fooForm"
. Within the template I can access the form with no problem, e.g. ng-disabled="fooForm.$invalid || fooForm.$submitted"
.
But how do I access that form from within the $mdDialog
controller? From what I read, I would expect to be able to do this:
const doFoo = () => {
if (this.fooForm.$dirty) {
Here this
is the dialog controller.
But I get an error: TypeError: Cannot read property '$dirty' of undefined
. And sure enough, if I put a breakpoint in the code, the controller has no fooForm
property.
I've tried using $scope
as well, but when I put a breakpoint in the code $scope
has no fooForm
property either.
Here's my dialog template:
<md-dialog aria-label="FooBar">
<md-toolbar>
<div class="md-toolbar-tools">
<h2>FooBar</h2>
<span flex></span>
<md-button class="md-icon-button" ng-click="dialog.cancel()">
<md-icon>close</md-icon>
</md-button>
</div>
</md-toolbar>
<form name="fooForm" ng-submit="dialog.ok()" novalidate>
<md-dialog-content>
<div layout="column" layout-padding>
<h2 class="md-headline">Foo</h2>
<div layout="row" layout-xs="column">
...
</div>
</md-dialog-content>
<md-dialog-actions>
<md-button class="md-primary" type="submit" ng-disabled="fooForm.$invalid || fooForm.$submitted">
OK
</md-button>
<md-button ng-click="dialog.cancel()">
Cancel
</md-button>
</md-dialog-actions>
</form>
</md-dialog>
How do I access a form in an $mdDialog
from the dialog controller?
Upvotes: 10
Views: 1614
Reputation: 1010
Give your controller name when your $mdDialog
initialize. see below code:
$scope.showDialog = function (ev) {
$mdDialog.show({
controller: 'myController',
templateUrl: 'template.html',
parent: angular.element(document.body),
targetEvent: ev,
clickOutsideToClose: false,
fullscreen: false // Only for -xs, -sm breakpoints.
})
.then(function (answer) {
$scope.status = 'You said the information was "' + answer + '".';
}, function () {
$scope.status = 'You cancelled the dialog.';
});
};
Make sure you put controller name in quotes when you create separate controller. like controller: 'myController'
if you want to pass a function then not quotes needed like controller: myController,
In html template use ng-submit="ok()"
instead of ng-submit="dialog.ok()"
.
I have created a sample plnkr with your template and it is working fine. check here
EDIT :`
angular.module('BlankApp', ['ngMaterial']).controller('myController', function($scope, $mdDialog) {
$scope.ok = function () {
if ($scope.fooForm.$dirty) {
// do whatever you want
$mdDialog.hide("mesage");
}
};
});`
Upvotes: -1
Reputation: 977
you need to assign the form to the Scope of the Controller. Do this by changing the form name from fooForm
to dialog.fooForm
.
<form name="dialog.fooForm" ng-submit="dialog.ok()" novalidate>
Upvotes: 5
Reputation: 5719
The form is not defined in your controller as a property and therefore you cannot access the form like if (this.fooForm.$dirty)
.
However you can easily pass it to your method:
const doFoo = (fooForm) => {
if (fooForm.$dirty) {
...
And in html:
ng-click="dialog.cancel(fooForm)"
Upvotes: 2
Reputation: 9476
function controller($scope) { var vm = this; vm.click = function() {} $scope.click = function() {} } <button ng-click="xxx.click()" ... <button ng-click="click()" ...
Now if you write ng-click="whatever();smth();"
angular will use $parse(expression)(scope)
to parse this expression.
Now you write form name="formName"
-- angular will use $parse("formName").assign(scope, form);
and put it to scope.
$parse is quite clever and can easily handle nested properties, to put form to your controller (as xxx): <form name="xxx.myForm"></form>
Upvotes: 2