EDIT:
Mam rozwiązać ten problem - dlatego, że drugi przykład wracał niezdefiniowany dlatego zmienne były przypisywane poza formie przedstawienia funkcji. IE w pełnym kontekście, tu jest mój cały plik przed którym się coraz niezdefiniowany:
(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
]);
})();
Funkcja submitRegistration był nazywany na formularzu złożyć w moim formularzu:
<form ng-submit="signup.submitRegistration()" id="signup-form" name="signup.signupForm" novalidate>
Jestem zgadywania, że zmienne w odniesieniu do postaci (tj. this.firstName
, this.lastName
, itp.) były undefined
, dopóki nie zostanie wywołana funkcja submit. Aby temu zaradzić, po prostu zamienione gdzie byłem przypisywania zmiennych:
(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
]);
})();
Teraz, zmienne zostały przeniesione do lokalnej zakres funkcji, to działa. Zgaduję, że kontroler nie ma dostępu do tych zmiennych, dopóki formularz nie zostanie przesłany, ale mogę się mylić.
PS: Jeśli zastanawiasz się, dlaczego definiuję funkcję kontrolera poza .controller()
, to łatwiej jest debugować, ponieważ w przypadku wyjątków, będę mieć nazwaną funkcję w moim śledzeniu stosu zamiast anonimowego.
Dzięki!
zależy od tego, kiedy ją przypiszesz ... pokaż pełny kontekst. 'this.form' nie zostanie zdefiniowany, dopóki widok nie zostanie skompilowany – charlietfl
Zamiast edytować pytanie, powinieneś opublikować swoje rozwiązanie jako odpowiedź. – asgoth
Dobra, właśnie to zrobiłem! Dzięki. – Thomas