2017-06-04 1 views
0

Je suis nouveau à promettre des concepts et je suis confronté à un problème pendant que j'essaie de soumettre un formulaire de connexion.Angular Promise ne lance pas un résumé

Lorsque la promesse est résolue, je souhaite mettre à jour l'interface utilisateur en modifiant la valeur d'une variable d'étendue.

Voici la méthode du contrôleur qui est appelé

$ctrl.loginForm = function(isValid) { 
    // check to make sure the form is completely valid 

    if (isValid) { 
     LoginService.login($ctrl.user).then(function (value) { 
      $ctrl.loginError = false; 
      var cookie = value.token; 
     }, function (reason) { 
      $ctrl.loginError = true; 

     }); 
    } 

    }; 

et voici ma méthode de service

service.login = function(credentials) { 
    return new Promise((resolve, reject) => { 
     $http.post(AppConst.Settings.apiUrl + 'api-token-auth/',credentials).success((data) => { 
     resolve(data); 
     }).error((err, status) => { 
     reject(err, status); 
     }); 
    }); 
    }; 

Donc, une fois la promesse est résolu le ctrl.loginError $ dans le changement du contrôleur sa valeur, mais il ne se met pas à jour sur l'interface utilisateur.

J'ai essayé avec $ apply et ça marche, mais je ne comprends pas pourquoi je dois utiliser $ apply! Je pensais que le cycle de digest commence par défaut!

Im je fais quelque chose de mal? Les méthodes

+0

pas besoin de résoudre la promesse comme ceci en service. vous pouvez renvoyer directement votre appel http –

+0

Le service $ http renvoie une promesse qui déclenche un résumé après traitement. Pas besoin d'envelopper une promesse native. Vous devriez accepter la réponse @Denis Reshetniak. – Jaime

Répondre

0

$http vous renvoient une promesse qui est un service $ q. Donc, le problème est que vous utilisez un wrapper de promesses natif qui ne dit pas à la portée d'angular d'exécuter la méthode $ apply. Changez votre service pour suivre

service.login = function(credentials) { 
    return $http.post(AppConst.Settings.apiUrl + 'api-token-auth/',credentials); 
};