AngularJS:如何通过$ http获取数据时禁用默认观察者

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AngularJS:如何通过$ http获取数据时禁用默认观察者相关的知识,希望对你有一定的参考价值。

我使用$ http.get来获取身份验证和用户详细信息,以便我可以显示用户名而不是登录按钮。

.directive("plunkerUserPane", ["collectionsManager", function(collectionsManager) {

  var getAuth = function($http) {
    $http.get('/user/auth').success(function(response) {
      if (response.isAuth) {
        return 'user.html';
      } else {
        return 'userPane.html';
      }
    });
  };

  return {
    restrict: "E",
    replace: true,
    template: '<div ng-include src="userPane.getTemplate()"></div>',
    controllerAs: "userPane",
    controller: ["$scope", "$http", "login", "visitor", function($scope, $http, login, visitor) {
      this.visitor = visitor;
      this.getTemplate = function() {
        var template = 'userPane.html';
        template = getAuth($http);
        return '/components/userPane/' + template;
      }
      this.showLoginWindow = function() {
        login.open();
      };
    }]
  };
}])

当get请求接收到数据时,默认观察者和启动和无限循环再次调用它。如何禁用它们或任何其他方式来解决此问题。

答案

scope方法上进行API调用并不是一个理想的解决方案,因为由于$digest循环,它们将被多次评估。您可以使用callbackspromises,并可以删除method以从模板生成http请求。

见下文

打回来

.directive("plunkerUserPane", ["collectionsManager", function(collectionsManager) {

  var getAuth = function($http, cb) {
    $http.get('/user/auth').success(function(response) {
      if (response.isAuth) {
        cb('user.html');
      } else {
        cb('userPane.html');
      }
    });
  };

  return {
    restrict: "E",
    replace: true,
    template: '<div ng-include src="userPane.template"></div>',
    controllerAs: "userPane",
    controller: ["$scope", "$http", "login", "visitor", function($scope, $http, login, visitor) {
      var self = this;
      self.visitor = visitor;
      self.template = 'userPane.html';
      self.showLoginWindow = function() {
        login.open();
      };
      getAuth($http, function(template) {
        self.template = '/components/userPane/' + template;
      });
    }]
  };
}])

要么

诺言

.directive("plunkerUserPane", ["collectionsManager", function(collectionsManager) {

  var getAuth = function($http, cb) {
    return $http.get('/user/auth').then(function(response) {
      if (response.isAuth) {
        return 'user.html';
      } else {
        return 'userPane.html';
      }
    });
  };

  return {
    restrict: "E",
    replace: true,
    template: '<div ng-include src="userPane.template"></div>',
    controllerAs: "userPane",
    controller: ["$scope", "$http", "login", "visitor", function($scope, $http, login, visitor) {
      var self = this;
      self.visitor = visitor;
      self.template = 'userPane.html';
      self.showLoginWindow = function() {
        login.open();
      };
      getAuth($http).then(function(template) {
        self.template = '/components/userPane/' + template;
      });
    }]
  };
}])

请注意上述解决方案中Promise Chain的使用

以上是关于AngularJS:如何通过$ http获取数据时禁用默认观察者的主要内容,如果未能解决你的问题,请参考以下文章

如何使用angularjs从json文件中获取数据

AngularJs,如何发送 $http 的参数 [重复]

AngularJS:http服务

如何从 angularjs 中的 JSONP 错误回调中获取数据?

AngularJS $http 获取返回空状态 0

AngularJS - $http get 返回状态为 0 的错误?