2017-04-26 3 views
0

Ich benutze Knoten, Express, Mungo für Backend und eckige js für Front-End. Ich sende eine Postanfrage mit einem Formular.Wie kann ich die Antwort einer POST-Anfrage mit Angular JS bekommen?

<div class="alert alert-success" ng-show="success"> 
    {{success}} 
</div> 

<div class="alert alert-danger" ng-show="error"> 
    {{error}} 
</div> 

    <form id="newCategory" ng-submit="submit()"> 
    <div class="row"> 
     <div class="col-md-4"> 
     {{mySubmit}} 
     <div class="form-group"> 
      <input id="name" name="name" type="text" 
      placeholder="Name" class="form-control input-md" 
      ng-model="catName"> 
     </div><!-- ./form-group --> 

     </div><!-- ./col --> 

     <div class="form-group"> 
     <input type="submit" name="submit" value="submit" class="btn btn-primary"> 
     </div><!-- ./form-group --> 

    </div><!-- ./row --> 
    </form> 

Sein Controller:

fetchModule.controller('CatsNewCtrl', ['$scope', '$rootScope', 'Request', 
    function($scope, $rootScope, Request) { 
     // Root Scope 
     $rootScope.heading = 'Categories'; 
     $rootScope.heading2 = 'new'; 
     $rootScope.newLink = undefined; 

     $scope.catName = ""; 
     $scope.submit = function() { 
     Request.post('/category', { name : $scope.catName }) 
      .then(function(data) { 
      $scope.success = data.msg; 
      }) 
      .catch(function(status) { 
      $scope.error = "Error: " + status; 
      }); 
     return false; 
     }; 
    }]); 

Ergebnis ist nichts, ich weiß nicht, wohin ich falsch gehe! Dieser Dienst funktioniert einwandfrei. Ich konnte das Ergebnis zwar per Konsole protokollieren, aber ich kann es nicht für den Bereich festlegen.

(function() { 
    let fetchModule = angular.module('fetchModule', []); 

    /** 
    * A Service for Requests. 
    */ 
    fetchModule.service('Request', ['$http', function($http) { 
    /** 
    * Get's content of a specific URL. 
    * @param {String} url - URL to GET. 
    * @return {Promise} Promise resolves with contents or rejects with an error. 
    */ 
    this.get = function(url) { 
     // Promise 
     return new Promise((resolve, reject) => { 
     $http.get(url) 
      .success(result => { 
      resolve(result); 
      }) 
      .error((err, status) => { 
      reject(err); 
      }); 
     }); 
    }; 

/** 
* Get's content of a specific URL. 
* @param {String} url - URL to GET. 
* @param {String} data - Data to post. 
* @return {Promise} Promise resolves with contents or rejects with an error. 
*/ 
this.post = function(url, data) { 
    // Promise 
    return new Promise((resolve, reject) => { 
    $http.post(url, data) 
     .success((data, status, headers, config) => { 
     resolve(data); 
     }) 
     .error((data, status, headers, config) => { 
     resolve(status); 
     }); 
    }); 
}; 

Bitte helfen, ich bin nur ein Winkelanlasser.

+1

Der Rückruf der Erfolgsmethode hat die Daten nicht, was Sie wollen? – user93

+0

Es ist! keine Probleme bis dahin, aber ich kann das Ergebnis in der Warnung nicht sehen –

+0

können Sie console.log (data.message) und überprüfen Sie statt data.msg? – Ved

Antwort

2

Sie verwenden eine Anti-Pattern-Verpackung $http in Promise, da $http selbst eine Verheißung zurückgibt.

Da global Promise außerhalb des eckigen Kontexts ist, muss der Bereichswinkel bei jeder Änderung benachrichtigt werden, um einen Auszug auszuführen, um die Ansicht zu aktualisieren. Mit kantigen Versprechen ist dies nicht der Fall.

ändern Request.post zu:

this.post = function(url, data) { 
    return $http.post(url, data); 
}; 

In Controller gibt es einen kleinen Unterschied, daß das Objekt hält, von dem Server in einer Eigenschaft, die Daten zurück data

$scope.submit = function() { 
    Request.post('/category', { name : $scope.catName }) 
     .then(function(resp) { 
     $scope.success = resp.data.msg; 
     }) 
     .catch(function(err) { 
     $scope.error = "Error: " + err.status; 
     }); 
    return false; 
    }; 

anzumerken, dass $http Methoden .success() und .error() sind veraltet

+0

Ihre Antwort scheint vernünftig, aber es funktioniert nicht bro! Ich benutze 1.3.9 eckig, wenn das hilft. Ich habe den Code genau so geändert, wie Sie sagten, gab nur die http.post() zurück und verwendete die .then, catch und .success und error too, aber kein Glück! –

+0

Jetzt habe ich sogar den Dienst beseitigt und mache $ http geradeaus gleiche Ausgabe wieder console.log funktioniert auf Umfang funktioniert nicht –

+0

welche von 'then()' oder 'catch()' wird ausgelöst? – charlietfl

0
scope.submit = function() { 
    $http({ 
     url:'/category', 
     method:'POST' 
     data:{ name : $scope.catName }, 
     headers: {'Content-Type': 'application/json'}, 
    }) 
     .then(function(resp) { 
     $scope.success = resp.data.msg; 
     },function(error){ 
     $scope.error = "Error: " + err.status;} 
    )}; 

Geben Sie nicht false zurück, da es sich um eine Rückruffunktion handelt. Verwenden Sie anstelle von catch block "function-block" wie oben.

Ich habe die Lösung verbessert. Wenn es funktioniert, können Sie es neu strukturieren, um wiederverwendeten Code zu Ihrem Dienst zu verschieben. Verpassen Sie nicht, $ http in Ihrem Controller zu injizieren.

+0

betrachten möchten Versucht, dass dieser Bro nicht funktioniert –

+0

Ich habe verbessert meine Antwort, probier es auch @Johnfoo –

Verwandte Themen