Я работаю над созданием небольшого приложения, которое принимает входные данные из формы (ввод, являющийся именем), а затем переходит к POST имени в макет webservice с помощью $ httpBackend. После POST я затем делаю GET также из mock webservice, используя $ httpBackend, который затем получает имя/переменную, которая была установлена с POST. После его получения из сервиса создается простое приветствие и отображается на клиенте.Получение undefined в AngularJS
Однако в настоящее время, когда данные теперь отображаются на клиенте, он читает «Hello undefined!». Когда он должен читать «Привет [любое имя, которое вы ввели]!». Я использовал Yeoman для создания своих приложений, поэтому я надеюсь, что каждый сможет понять мою структуру файлов и каталогов.
Моего app.js:
'use strict';
angular
.module('sayHiApp', [
'ngCookies',
'ngMockE2E',
'ngResource',
'ngSanitize',
'ngRoute'
])
.config(function ($routeProvider) {
$routeProvider
.when('/', {
templateUrl: 'views/main.html',
controller: 'MainCtrl'
})
.otherwise({
redirectTo: '/'
});
})
.run(function($httpBackend) {
var name = 'Default Name';
$httpBackend.whenPOST('/name').respond(function(method, url, data) {
//name = angular.fromJson(data);
name = data;
return [200, name, {}];
});
$httpBackend.whenGET('/name').respond(name);
// Tell httpBackend to ignore GET requests to our templates
$httpBackend.whenGET(/\.html$/).passThrough();
});
Моего main.js:
'use strict';
angular.module('sayHiApp')
.controller('MainCtrl', function ($scope, $http) {
// Accepts form input
$scope.submit = function() {
// POSTS data to webservice
setName($scope.input);
// GET data from webservice
var name = getName();
// Construct greeting
$scope.greeting = 'Hello ' + name + ' !';
};
function setName (dataToPost) {
$http.post('/name', dataToPost).
success(function(data) {
$scope.error = false;
return data;
}).
error(function(data) {
$scope.error = true;
return data;
});
}
// GET name from webservice
function getName() {
$http.get('/name').
success(function(data) {
$scope.error = false;
return data;
}).
error(function(data) {
$scope.error = true;
return data;
});
}
});
Моего main.html:
<div class="row text-center">
<div class="col-xs-12 col-md-6 col-md-offset-3">
<img src="../images/SayHi.png" class="logo" />
</div>
</div>
<div class="row text-center">
<div class="col-xs-10 col-xs-offset-1 col-md-4 col-md-offset-4">
<form role="form" name="greeting-form" ng-Submit="submit()">
<input type="text" class="form-control input-field" name="name-field" placeholder="Your Name" ng-model="input">
<button type="submit" class="btn btn-default button">Greet Me!</button>
</form>
</div>
</div>
<div class="row text-center">
<div class="col-xs-12 col-md-6 col-md-offset-3">
<p class="greeting">{{greeting}}</p>
</div>
</div>
функция GetName() -> Это должно быть добросовестным AngularJS службы, с введением зависимостей. Сейчас все - ваш контроллер, что плохой плохой идеей в мире ANgular. –
Прошу прощения, я новичок в Angular, и я не уверен, что вы подразумеваете под «добросовестным»? Вы говорите, что я должен просто извлечь функции 'setName' и 'getName' в другой отдельный файл? – Tiwaz89
Google - ваш друг :-) http://www.thefreedictionary.com/bona+fide Услуги AngularJS являются однополыми и лучше подходят для любого CRUD. [http://blog.manishchhabra.com/2013/09/angularjs-service-vs-factory-with-example/](http://blog.manishchhabra.com/2013/09/angularjs-service-vs-factory -with-example /) - отдельный файл, если хотите. Главное, чтобы явное создание/объявление службы, которую вы импортируете с DI в свой контроллер. Создайте/interface_your_API в своей службе, запрограммируйте любую функцию CRUD, которая вам нужна, и верните ее. Ваше обещание может быть в сервисе (лучше всего) или контроллере. –