EDIT:
ho risolto il problema - la ragione per cui il secondo esempio è stato restituisce undefined era perché le variabili venivano assegnati al di fuori della forma funzione di invio. IE nel contesto completo, qui è tutta la mia file prima di cui mi stavo indefinito:
(function() {
'use strict';
//signup controller definition
var SignupCtrl = function($http, $q, User, FormTools) {
var firstName = this.firstName,
lastName = this.lastName,
password = this.password,
form = this.signupForm;
function submitRegistration() {
//check if the form is valid
if(form.$valid) {
console.log("valid");
var user = {
firstName: firstName,
lastName: lastName,
password: password
};
User.createUser(user)
.then(function(response) {
console.log('user saved!');
}, function(err) {
console.error('error, user wasn\'t saved. reason: ' + err);
});
//if the form isn't valid at all
} else {
return false;
}
}
this.submitRegistration = submitRegistration;
};
angular
.module('signup', [])
.config(['$stateProvider', function($stateProvider) {
$stateProvider
.state('signup', {
url: '/signup',
//path relative to index.html
templateUrl: 'modules/signup/signup.html',
controllerAs: 'signup',
controller: 'SignupCtrl'
});
}])
.controller('SignupCtrl', [
'$http',
'$q',
'User',
'FormTools',
SignupCtrl
]);
})();
La funzione submitRegistration era stato chiamato sulla forma presentare nella mia forma:
<form ng-submit="signup.submitRegistration()" id="signup-form" name="signup.signupForm" novalidate>
sto indovinando che le variabili per quanto riguarda il modulo (ad esempio this.firstName
, this.lastName
, ecc.) erano undefined
fino a quando viene chiamata la funzione di invio. Per rimediare a questo, ho solo scambiato dove stavo assegnando le variabili:
(function() {
'use strict';
//signup controller definition
var SignupCtrl = function($http, $q, User, FormTools) {
function submitRegistration() {
var firstName = this.firstName,
lastName = this.lastName,
password = this.password,
form = this.signupForm;
//check if the form is valid
if(form.$valid) {
console.log("valid");
var user = {
firstName: firstName,
lastName: lastName,
password: password
};
User.createUser(user)
.then(function(response) {
console.log('user saved!');
}, function(err) {
console.error('error, user wasn\'t saved. reason: ' + err);
});
//if the form isn't valid at all
} else {
return false;
}
}
this.cool = function() {
console.dir(this.signupForm);
};
this.submitRegistration = submitRegistration;
this.sayHello = User.sayHello;
};
angular
.module('signup', [])
.config(['$stateProvider', function($stateProvider) {
$stateProvider
.state('signup', {
url: '/signup',
//path relative to index.html
templateUrl: 'modules/signup/signup.html',
controllerAs: 'signup',
controller: 'SignupCtrl'
});
}])
.controller('SignupCtrl', [
'$http',
'$q',
'User',
'FormTools',
SignupCtrl
]);
})();
Ora che le variabili sono stati spostati nel campo di applicazione funzione locale, funziona. Immagino che il controllore non abbia accesso a quelle variabili fino a quando il modulo non sarà presentato, ma potrei sbagliarmi.
PS: Nel caso in cui ti stia chiedendo perché definisco la mia funzione di controller al di fuori di .controller()
, trovo che sia più facile eseguire il debug perché in caso di eccezioni avrò una funzione con nome nella mia traccia di stack invece di una anonima.
Grazie!
dipende da quando lo si assegna ... mostra il contesto completo. 'this.form' non sarà definito fino a quando la vista non verrà compilata – charlietfl
Invece di modificare la tua domanda, dovresti pubblicare la soluzione come risposta. – asgoth
Esatto, l'ho fatto! Grazie. – Thomas