2017-02-17 14 views
1

プロミスオブジェクトを使用して作成されたログインフォームがあります。 forma検証が実行される場合を除いてすべてが正常に動作します。 ここに私のhtmlファイルがあります。私は、フォームを初めて訪問したときに妥当性検査の失敗後にプロミスが解決されない

<form id="signin" class="signinform" autocomplete="off"> 
    <span ng-show="errorName" class="error_block">{{ errorName }}</span> 
    <input placeholder="User Name" ng-model="user.name" type="text" name="user_name" required> 
    <input placeholder="Password" ng-model="user.password" type="password" name="password" required> 
    <input type="submit" ng-click="submit(user)" value="Log IN" id="submit"> 
</form> 

はここでNG-クリックが

$scope.submit = function(user){ 
    LoginService.login(user) 
    .then(function(response) {   
     var userInfo = response.userName 
     $rootScope.$emit('myEvent',userInfo); 
     $location.path("/details/1"); 
    }, 
    function(error) { 
     $scope.errorName = "Invalid Username or Password"; 
    }); 
} 

を書かれているコントローラは、ここで

app.factory("LoginService", function($http, $q, $window) { 
var userInfo; 
var deferred = $q.defer(); 
function login(user) { 
    $http({ 
    method: 'POST', 
    url: "login.php", 
    data: { "userName": user.name, "password": user.password }, 
    headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'} 
    }).then(function(result) { 
    userInfo = { 
    accessToken: result.data.login.token, 
    userName: result.data.login.name 
    }; 
    $window.sessionStorage["userInfo"] = JSON.stringify(userInfo); 
    deferred.resolve(userInfo); 
    }, function(error) { 
    deferred.reject(error); 
    });  
    return deferred.promise; 
    } 

    return { 
    login: login 
    }; 
}); 

の工場出荷時のサービスは今何が起こるかですされており、有効な結果を持つフォームを送信してください。ログインプロセスは成功し、私は「詳細」にリダイレクトされます。しかし、ユーザー名またはパスワードが間違ってフォームが拒否された場合、エラーが表示されます。

その後、私は正しい資格情報を入力して、私は '詳細'にリダイレクトされず、そのエラーが表示されている同じログインフォームに立ち往生していない場合は表示されます。 しかし、私はページをリフレッシュするとき、私はすでにログインしています。これは、http要求が発生し、userInfoが設定されているためです。

コードをデバッグし、その関数が$ scope.submitで実行されていないことが判明しました。これは、約束が解決されていない可能性があるためです。私はいくつかのscope.applyと他のものを試しましたが、何も働かなかった。 誰でもここで起こっていることを助けることができますか?

答えて

2

@Akisあなたはそれが永遠にその約束のために、それはそれだ、一度成就(または拒否)です一度ので、一度だけ延期を作成して、言ったように。これは、約束が一度だけ(解決済みか拒否のいずれかで)解決されるためです。

P.S.ペットの嫌い...約束の言葉 - 約束が成就したか拒絶されたかを意味する - しかし、ほとんどの例ではresolveという名前を使用しています!

あなたがすべてで延期使用する必要はありませんので、私はこの答えを追加しました、明確に$ HTTPとして見ることは約束を返す - このインスタンスに延期(またはnew Promiseコンストラクタ)を使用してアンチパターンとみなされ

私は$httpが実行される直前に$window.sessionStorage.removeItem("userInfo");を追加したことにも注意してください、 - この時点で働いていた

app.factory("LoginService", function($http, $q, $window) { 
    function login(user) { 
     // added this as it seems it should be done! 
     $window.sessionStorage.removeItem("userInfo"); 
     return $http({ 
      method: 'POST', 
      url: "login.php", 
      data: { 
       "userName": user.name, 
       "password": user.password 
      }, 
      headers: { 
       'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8' 
      } 
     }).then(function(result) { 
      var userInfo = { 
       accessToken: result.data.login.token, 
       userName: result.data.login.name 
      }; 
      $window.sessionStorage["userInfo"] = JSON.stringify(userInfo); 
      return userInfo; 
     }); 
    } 
    return { 
     login: login 
    }; 
}); 
+0

はい、それは論理的、高すぎるようです.. – ronit

0

これは、約束がすでに解決されているためです。

var deferred = $q.defer();宣言をlogin関数に移動してみてください。

function login(user) { 
    var deferred = $q.defer(); 

    $http({ 
    method: 'POST', 
    url: "login.php", 
    data: { "userName": user.name, "password": user.password }, 
    headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'} 
    }).then(function(result) { 
    userInfo = { 
    accessToken: result.data.login.token, 
    userName: result.data.login.name 
    }; 
    $window.sessionStorage["userInfo"] = JSON.stringify(userInfo); 
    deferred.resolve(userInfo); 
    }, function(error) { 
    deferred.reject(error); 
    });  
    return deferred.promise; 
    } 

    return { 
    login: login 
    }; 
+0

ありがとうの@akisを、のSessionInfoをクリアするために論理的なようです。正直言って私は約束のコンセプトについて混乱していました。しかし、それは多くをクリアしました。負のスコアは必要ありませんでした。角度とスタックのオーバーフローに新しいです:( – ronit

+0

これは私のことではありませんでしたdownvoted:Dあなたの質問はちょうど良いです – Akis

関連する問題