2015-05-22 25 views
2

我有一個小問題,使用AngularJS(v1.3.15)和Angular-Route開發一個簡單的GUI遊戲創意。 無論如何,對於註冊,我想在輸入時預先檢查用戶名的可用性。我設置了一個$ watch,調用工廠服務來獲得一個$ http.post答案,但在我的控制器中,出現錯誤「fwMainService.checkUsernameAvailability(...)。那麼它不是函數」。 我三重檢查每一個拼寫,語法和邏輯(順便說一句,我是新來的Angular)。 其他每個工廠功能都按其應有的工作。angularjs .then()不起作用(然後不是函數)

是否因爲checkUsernameAvailability()應該返回一個promise,而不是一個字符串?

任何想法?提前致謝!

我廠:

"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/ 也許有人會受到它的工作...

+0

試試這個返回checkUsernameAvailability(username); – carton

+0

究竟在哪裏? – Kapparina

+0

在您的工廠更換 返回mFac.checkUsernameAvailability(用戶名);通過返回checkUsernameAvailability(username); (我不知道這個解決方案,但你可以嘗試) – carton

回答

3

的需要的jsfiddle一些調整工作,但一般來說,你需要做的工作是:

  • 在mFac.checkUsernameAvailability函數中你需要返回 $ http.post()的結果。
  • 您需要向工廠注入$ q。
  • 而不是返回res.data,只是返回水庫
  • 在你返回一個字符串的所有事件中,返回$ q.when(str)(其中str是字符串)。這將確保你的函數的所有存在路徑都返回一個承諾(然後你可以在任何情況下調用)。
+0

爲什麼需要注入$ q?我不在函數 – Kapparina

+0

中使用多個$ http請求。因此,您可以使用$ q.when()封裝您使用承諾返回的字符串。我創建了一個基於你的工作jsFiddle:https://jsfiddle.net/orendr/bj1cgqxf/ – OrenD

+0

據我所知,工廠函數必須返回一個承諾,對吧?所以如果它應該返回一個字符串,那麼必須使用$ q.when()將字符串轉換爲承諾,對吧? – Kapparina