У меня небольшая проблема с разработкой простого графического интерфейса для идеи игры с использованием AngularJS (v1.3.15) и Angular-Route. В любом случае, для регистрации я хочу предварительно проверить доступность имени пользователя при вводе. Я установил $ watch, вызвал заводскую службу, чтобы получить ответ $ http.post, но в моем контроллере я получаю ошибку « fwMainService.checkUsernameAvailability (...). Then is not a function ". Я трижды проверил каждую орфографию, синтаксис и логику (кстати, я новичок в Angular). Все остальные фабричные функции работают так, как должны.
Это потому, что checkUsernameAvailability () должен возвращать обещание, а не строку?
Любые идеи? Заранее спасибо!
Моя фабрика:
"use strict";
fwApp.factory('fwMainService', function ($http) {
var mFac = {};
mFac.checkUsernameAvailability = function (username) {
if(username != '') {
if(username.length >= 3) {
$http.post('api/user/usernameInUse.php', {newUser: username})
/* returns '1' if in use, '0' if free */
.success(function (res) {
if(res == '1') { // Username in use
return 'In Use!';
} else if(res == '0') {
return 'Free!';
}
})
.error(function (error) {
console.log("username check error: ", error);
});
} else {
return 'Username too short!';
}
} else {
return ''; // if empty, do not check
}
};
[...]
// Public API
return {
checkUsernameAvailability: function (username) {
return mFac.checkUsernameAvailability(username);
},
[...]
Мой контроллер:
"use strict";
fwApp.controller('IndexCtrl',
['$scope', '$http', '$timeout', '$location', 'fwMainService',
function ( $scope, $http, $timeout, $location, fwMainService) {
/* username input field model = newUser.username */
$scope.$watch("newUser.username", function (newValue, oldValue) {
if(angular.equals(newValue, oldValue)) {
return;
}
fwMainService.checkUsernameAvailability(newValue).then(function (res) {
console.log("return", res.data);
$scope.newUserMsg = res.data; // Setting infobox to "Free!" or "In Use!"
}, function (error) {
console.log("username check Error:", error);
});
});
[...]
Редактировать №1: я добавил jsfiddle: http://jsfiddle.net/Kyrm/71kz617g/6/ < / а> Может у кого-то заработает ...
1 ответ
Для работы jsFiddle потребовалась некоторая настройка, но в целом, что вам нужно сделать, чтобы эта работа заработала, это:
- В функции mFac.checkUsernameAvailability вам нужно вернуть результат $ http.post ().
- Вам нужно ввести $ q в factory.
- Вместо того, чтобы возвращать res.data, просто верните res
- Во всех случаях, когда вы возвращаете строку, возвращайте $ q.when (str) (где str - это строка). Это гарантирует, что все существующие пути вашей функции возвращают обещание (а затем вы можете вызывать его во всех случаях).
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.