javascript - Angular 尝试读取服务中的属性

标签 javascript angularjs

在下面的脚本中,我尝试从 cartDataService 访问数据,即使我设法从 cartDataService 读取 this.test,我得到的 cart_id 为空值。我知道这是由于javascript的异步特性 我非常确定在分配服务之前尝试从服务访问 cart_id,如何确保分配了服务的 cart_id?谢谢

var app = angular.module('myApp', [])

app.service('cartDataService', function () {
    this.cart_id = ""
    this.getcart_id = function(){ return this.cart_id};
    this.setcart_id = function(id){
        this.cart_id = id
    }
    this.test = "byebye"
})


app.controller('OrderDetailCtrl', ['$http', 'cartDataService', function ($http, cartDataService) {
    var self = this
    self.msg = 'Order Detail'
    self.order_id = outer_id
    self.orders = {
        get: function () {
            return $http.get('http://apimucommerce/api/order/' + self.order_id + '/')
                .then(function (response) {
                    return response.data
                })
        }
    }

    self.orders.get().then(function (data) {
        self.order = data
        self.cart_id = self.order.cart_id
        cartDataService.setcart_id(self.order.cart_id)
    })

}])

app.controller('CartController', ['cartDataService', function (cartDataService) {

    var self = this

    self.cart_id = cartDataService.getcart_id()
    alert(cartDataService.cart_id)
    self.msg = cartDataService.test
}])

最佳答案

你可以使用这个:

app.controller('CartController', ['$scope', 'cartDataService', function  ($scope, cartDataService) {
    var self = this
    $scope.$watch(
        function () watcher{
            return cartDataService.getcart_id();
        }, 
        function () onCardIdChanged{
            self.cart_id = cartDataService.getcart_id()
            alert(self.cart_id);
        }
    );
}]);

解决问题的另一种方法:

app.service('cartDataService', ['$q', function ($q) {
    var deffered = $q.defer();

    this.cart_id = "";
    this.getcart_id = function(){ 
        return deffered.promise; 
    };
    this.setcart_id = function(id){
        this.cart_id = id;
        deffered.resolve(;
    }
}]);

app.controller('CartController', ['$scope', 'cartDataService', function  ($scope, cartDataService) {
    var self = this;
    cartDataService.getcart_id().then(function (cardId) {
        self.cart_id = cartDataService.getcart_id()
        alert(self.cart_id);
    });
}]);

更新:

app.service('cartDataService', ['$q', function ($q) {
    var deffered = $q.defer();

    this.cart_id = "";
    this.getcart_id = function(){ 
        return deffered.promise; 
    };
    this.setcart_id = function(id){
        this.cart_id = id;
        deffered.resolve(id);
    }
}]);

app.controller('CartController', ['$scope', 'cartDataService', function  ($scope, cartDataService) {
    var self = this;
    cartDataService.getcart_id().then(function (cardId) {
        self.cart_id = cardId;
        alert(self.cart_id);
    });
}]);

关于javascript - Angular 尝试读取服务中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33707511/

相关文章:

javascript - 如何在VueJS 3项目中导入Deepgram nodeJS SDK

javascript - Console.log() 不会输出到 C++ 中 Awesomium 的远程调试器

在共享点页面上加载 SPFX Webpart 之前调用 Javascript

json - 在 Ng-Table 上加载 JSON 数据后分页不起作用

javascript - 最好使用 Angular 将非 JSON 文件更改为真正的 JSON 文件

javascript - AngularJS - Angularchart - 错误没有方法 'width'

javascript - Node const 变量也被更改

javascript - 从8到9的 Angular 更新给测试框架带来了问题

javascript - 不同的状态不显示 ui-views

javascript - 如何从 Protractor 测试发出 POST 请求?