2015-09-25 6 views
1

Я пытаюсь создать форму /, которая отправляет данные на мой веб-сервер. Страница загружает контроллер, потому что он выполняет функцию отправки. Я получаю ошибку "ReferenceError: formData is not defined", когда я ссылаюсь на данные formData. Я думал, что это правильный способ инициализации членов контроллера.Инициализация элемента контроллера AngularJS

var app = angular.module('messagingForm', []); 
app.controller('messagingController', function($scope, $http) { 
    $scope.formData = { 
    userName: "bob", 
    email: "[email protected]", 
    subject: "why", 
    message: "why not?" 
    }; 

    $scope.submitted = false; //used so that form errors are shown only after the form has been submitted 
    $scope.submit = function(sendContact) { 
    $scope.submitted = true; 

    console.log('validating data'); 
    if (sendContact.$valid) { 
     console.log('sending data'); 
     $http({ 
     method: 'post', 
     url: 'email.php', 
     data: { 
      'name': formData.userName, 
      'email': formData.email, 
      'subject': formData.subject, 
      'message': formData.message 
     }, 
     headers: { 
      'Content-Type': 'application/x-www-form-urlencoded' 
     } //set the headers so angular passing info as form data (not request payload) 
     }).success(function(data) { 

     }); 
    } else { 

     console.log('validating not good'); 
     alert('failed'); 
    } 
    } 
}); 

Непонятно, как я инициализирую переменную-член, я думаю. Каков правильный способ сделать это?

Мэтт.

+0

Показать HTML-код контроллера связан с – christiandev

ответ

1

Try с этим:

Изменение:

data: { 
     'name': formData.userName, 
     'email': formData.email, 
     'subject': formData.subject, 
     'message': formData.message 
    }, 

в

data: { 
    'name': $scope.formData.userName, 
    'email': $scope.formData.email, 
    'subject': $scope.formData.subject, 
    'message': $scope.formData.message 
}, 

Тогда:

var app = angular.module('messagingForm', []); 
 
app.controller('messagingController', function($scope, $http) { 
 
    $scope.formData = { 
 
    userName: "bob", 
 
    email: "[email protected]", 
 
    subject: "why", 
 
    message: "why not?" 
 
    }; 
 

 
    $scope.submitted = false; //used so that form errors are shown only after the form has been submitted 
 
    $scope.submit = function(sendContact) { 
 
    $scope.submitted = true; 
 

 
    console.log('validating data'); 
 
    if (sendContact.$valid) { 
 
     console.log('sending data'); 
 
     $http({ 
 
     method: 'post', 
 
     url: 'email.php', 
 
     data: { 
 
      'name': $scope.formData.userName, 
 
      'email': $scope.formData.email, 
 
      'subject': $scope.formData.subject, 
 
      'message': $scope.formData.message 
 
     }, 
 
     headers: { 
 
      'Content-Type': 'application/x-www-form-urlencoded' 
 
     } //set the headers so angular passing info as form data (not request payload) 
 
     }).success(function(data) { 
 

 
     }); 
 
    } else { 
 

 
     console.log('validating not good'); 
 
     alert('failed'); 
 
    } 
 
    } 
 
});

Потому что в вашем коде «formaData» он не существует в контексте. Вы можете попробовать также объявить локальную переменную, что-то вроде этого:

var formData = { 
    userName: "bob", 
    email: "[email protected]", 
    subject: "why", 
    message: "why not?" 
}; 

Пример:

var app = angular.module('messagingForm', []); 
app.controller('messagingController', function ($scope, $http) { 
    var formData = { 
     userName: "bob", 
     email: "[email protected]", 
     subject: "why", 
     message: "why not?" 
    }; 

    $scope.submitted = false; //used so that form errors are shown only after the form has been submitted 
    $scope.submit = function(sendContact) { 
     $scope.submitted = true; 

     console.log('validating data'); 
     if (sendContact.$valid) { 
      console.log('sending data'); 
      $http({ 
       method : 'post', 
       url  : 'email.php', 
       data : { 
        'name': formData.userName, 
        'email': formData.email, 
        'subject': formData.subject, 
        'message': formData.message 
       }, 
       headers : { 'Content-Type': 'application/x-www-form-urlencoded' } //set the headers so angular passing info as form data (not request payload) 
      }).success(function(data){ 

      }); 
     } else { 

      console.log('validating not good'); 
      alert('failed'); 
     } 
    } 
}); 
+0

ОК, это ответ. Почему я должен использовать $ scope в функции, являющейся членом контроллера? Я предполагаю, что он не похож на Java или C# этого члена, который неявно содержит все ссылки на данные члена? – tatmanblue

+0

$ scope - объект, который относится к модели приложения. В этом случае вы объявляете объект внутри $ scope. $ scope.formaData = {}; Аналогичным образом вы можете использовать: var formData = {}; Здесь приведена ссылка о $ scope https://docs.angularjs.org/guide/scope. Я надеюсь, это поможет вам. –

+0

Вам нужно указать $ scope в вашем контроллере, чтобы получить контекст, в котором хранится модель, чтобы к ней могли обращаться контроллеры, директивы и выражения. –

1

Вы также можете создать formData объект как константу, а затем явно передать его в контроллер.

var app = angular.module('messagingForm', []).constant("formData", { 
    'userName': 'bob', 
    'email': '[email protected]', 
    'subject': 'why', 
    'message': 'why not?' 
}); 
app.controller('messagingController', function($scope, $http, formData) { 

Остальной ваш код здесь ...

Это просто делает его немного понятнее и проще тестировать.

Смежные вопросы