У меня небольшая проблема с разработкой простого графического интерфейса для идеи игры с использованием 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/ < / а> Может у кого-то заработает ...

2
Robin K 22 Май 2015 в 12:09
Попробуйте это вернуть checkUsernameAvailability (имя пользователя);
 – 
carton
22 Май 2015 в 12:15
На заводе замените return mFac.checkUsernameAvailability (имя пользователя); по возврату checkUsernameAvailability (имя пользователя); (я не уверен в этом решении, но вы можете попробовать)
 – 
carton
22 Май 2015 в 12:17
Отрицательно, я получаю Ошибка: checkUsernameAvailability не определена , хотя
 – 
Robin K
22 Май 2015 в 12:31
Не могли бы вы сделать код, пожалуйста, я могу вам помочь :)
 – 
carton
22 Май 2015 в 12:33
Пожалуйста, извините за мое незнание, но что такое кодовый ключ? Что такое плункер или jsfiddle?
 – 
Robin K
22 Май 2015 в 13:06

1 ответ

Лучший ответ

Для работы jsFiddle потребовалась некоторая настройка, но в целом, что вам нужно сделать, чтобы эта работа заработала, это:

  • В функции mFac.checkUsernameAvailability вам нужно вернуть результат $ http.post ().
  • Вам нужно ввести $ q в factory.
  • Вместо того, чтобы возвращать res.data, просто верните res
  • Во всех случаях, когда вы возвращаете строку, возвращайте $ q.when (str) (где str - это строка). Это гарантирует, что все существующие пути вашей функции возвращают обещание (а затем вы можете вызывать его во всех случаях).
3
OrenD 22 Май 2015 в 13:59
Зачем нужно вводить $ q? Я не использую несколько запросов $ http в функции
 – 
Robin K
22 Май 2015 в 14:02
Чтобы вы могли заключить возвращаемые вами строки в обещание, используя $ q.when (). Я создал рабочий jsFiddle на основе вашего: jsfiddle.net/orendr/bj1cgqxf
 – 
OrenD
22 Май 2015 в 14:05
Насколько я понимаю, фабричная функция ДОЛЖНА возвращать обещание, верно? Так что, если он должен вернуть строку, ее нужно превратить в обещание с помощью $ q.when (), верно?
 – 
Robin K
22 Май 2015 в 14:24