工厂更改时更新控制器中的值

时间:2016-01-18 12:01:17

标签: angularjs angularjs-service

我有一个工厂服务来控制购物车,当我还在配置购物车时,我将会出现与控制器同步数据的问题。

该过程包括分析用户是否已登录。如果他,那么spCart = 0,如果他被记录,那么我将不得不进行其他验证。让我们说我还有2个验证要做:

  • 如果用户的地址有效,
  • 如果地址在一个范围内,那么运费将为0;

如果用户没有有效地址,则spCart = 1;

如果他有一个地址并且在该范围内,

spCart = [
    'items':[], //add items here
    cost: '0'
];

或者如果不在范围内:

spCart = [
    'items':[], //add items here
    cost: '9.99'
];

问题是,其中一些验证需要等待$http,这样我就无法将来自工厂的spCart值与控制器同步。这就是我所做的:

控制器:

function CartController(factCart) {
    var sp = this;
    factCart.initialLoad();
    sp.cart = factCart.getCart();
};

工厂:

function factCart (localStorageService,factMain) {
    var spCart = 0;


    var service = {
        initialLoad:    _initialLoad,
        getCart:        _getCart
    };
    return service;

    function _initialLoad() {
        var userData = localStorageService.cookie.get(ngApp);
        if (userData) {
            var func = 'load_address';
            factMain.methodGet(func).then(function(res){ //$http from main factory
                if(res==0) {
                    return spCart = [1];
                } else {
                    _checkRange(res);
                }
            });
        } else if (!userData) {
            return spCart;
        };
    };

    function _checkRange(data) {
        spCart = [];
        spCart['items'] = [];
        /*
         logic here
        */
        if (inRange) {
            spCart['costs'] = {
                cost: 0;
            };
            return spCart;
        } else {
            spCart['costs'] = {
                cost: 9.99;
            };
            return spCart;
        };
    };

    function _getCart() {
        return spCart;
    };
};

问题是,spCart值始终为0,更新后它不会发生变化,我也不知道如何解决此问题

注意:将商品添加到购物车时出现此问题,视图未更新。我使用$apply()解决了这个问题。但在这种情况下,我无法使用$apply,它说“无法阅读财产......'

1 个答案:

答案 0 :(得分:0)

我设法让它发挥作用。我不知道这是否是最好的解决方案,所以我会打开问题。

但是我必须保持初始数组就像我想要的那样,当所有的验证都没问题并添加一个额外的字段来控制一切。

所以我会有一个像这样的数组:

spCart = [];
spCart['address'] = {
    verification: 0,
    address: 'name of address',
    //..etc..
};
spCart['items']= [];
//..Rest of array - for checkout only

这样,verification内的数据正在更新。这不是最好的方式(或者至少不是我的预期),因为我暴露了整个数组,而不是单个值。

所以,如果有更好的解决方案,那将非常受欢迎。

相关问题