javascript - 如何使用 Angular JS 获取 POST 请求的响应?

标签 javascript angularjs node.js post asynchronous

我使用 Node、Express、Mongoose 作为后端,使用 Angular JS 作为前端。我正在使用表单发送帖子请求。

<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>

其 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;
      };
  }]);

结果什么都没有,我不知道我哪里错了!该服务工作正常,事实上我能够通过控制台记录结果,但无法在范围内设置它。

(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);
      });
  });
};

请帮助我,我只是一个 Angular 初学者。

最佳答案

您正在 Promise 中使用反模式包装 $http,因为 $http 本身返回一个 Promise。

此外,由于全局 Promise 位于 Angular 上下文之外,因此每当它更改范围时,都需要通知 Angular 运行摘要以更新 View 。使用 Angular promise ,情况并非如此。

Request.post 更改为:

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

在 Controller 中,有一个细微的区别,即返回的对象将来自服务器的数据保存在属性 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;
  };

请注意,$http 方法 .success().error() 已弃用

关于javascript - 如何使用 Angular JS 获取 POST 请求的响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43632915/

相关文章:

javascript - D3.js:x 轴,刻度之间的间隔可变

javascript - 如何在 redux 辅助函数中引用 React 组件的状态

javascript - 获取选项标签之间的文本以与 Google map 路线计算器一起使用

javascript - AngularJS - 对象分配不起作用

javascript - ng-init 和 ng-controller 的问题

node.js - 在 Google Cloud App Engine 上运行 GraphQL 服务器

node.js - 有没有一种简单的方法可以将 express 应用程序转换为 meteor?

javascript - JavaScript 中的原型(prototype)/类/公共(public)属性

node.js - Meteor ReferenceError 缓冲区未定义

jquery - 以 Angular 插入 DIV 文本