如何在angularjs中访问承诺函数之外的对象

时间:2017-11-25 12:54:26

标签: javascript angularjs promise angularjs-scope

我是angularjs的新手,作为首发,我在访问函数之外的对象时遇到问题。我创建了一家工厂:

    var injectParams = ['$http'];
    var address = function ($http) {
    var factory = {};

    factory.get = function () {
        return $http({
            method: "POST",
            url: '/address',
            headers: {
                'Content-Type': 'application/json'
            },
            data: {
                service: 'address'
            }
        });
    };
  return factory;
 }

控制器方法:

   function getAddresses() {
        address_factory.get().then(function success(response) {
            $scope.billing = response.data.billing;
            $scope.shipping = response.data.shipping;
            console.log(response.data);

        }, function error(x) {
            console.log(x);
        });
    }
   getAddresses();

问题是如何在$scope.billing函数之外访问getAddresses对象?我已经阅读了angularjs中的承诺,但我不明白如何使用......

2 个答案:

答案 0 :(得分:1)

$scope.billing可在控制器中的任何位置访问,并且模板绑定到该控制器。但是$scope.billing的值是动态的,它是undefined,直到工厂获得Promise得到解决。要反映模板中$scope.billing的动态特性,您可以尝试以下方法:

 function getAddresses() {
    $scope.loading = true;
    address_factory.get().then(function success(response) {
      $scope.billing = response.data.billing;
      $scope.loading = false;
      $scope.error = null;
    }, function error() {
      $scope.loading = false;
      $scope.error = true;
    });
  }
 getAddresses();

然后在模板中:

<div ng-if="loading">
  Loading...
</div>
<div ng-if="!loading && error">
  Got an error!
</div>
<div ng-if="!loading && !error">
  Billing: {{billing}}
</div>

此外,您可以在控制器中使用$scope.$watch来监控$scope.billing更改:

// ...
getAddresses();

$scope.$watch('billing', function() {
  // $scope.billing has been changed
  console.log($scope.billing);
});

但我建议在Promise.then电话的成功回调中做所有必要的逻辑。

答案 1 :(得分:0)

$ scope 表示当前范围,即 some-controller.js &amp; some-view.html 可以访问。

如果您将任何变量设置为 $ scope ,则可以在some-controller.js&amp ;;一些-view.html。

假设您将 ng-controller 设置为任何div <div ng-controller="SomeController">.....</div>。因此,在控制器中设置$ scope.something等$ scope的任何东西都可以在控制器中访问并且也可以使用这个div,因为控制器的范围是这样的。