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

Update value in controller when factory changes

我有一个工厂服务来控制购物车,当我还在配置购物车时,我将无法与控制器同步数据。

该过程包括分析用户是否登录。如果他不是,那么spCart = 0,如果他登录了,那我就得做其他的验证了。假设我还有 2 个验证要做:

如果用户没有有效地址,则 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,它说 'Cannot read property...'

我成功了。我不知道这是否是最好的解决方案,所以我会继续提问。

但是当所有验证都正常时,我必须保留初始数组,就像我希望的那样,并添加一个额外的字段来控制所有内容。

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

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

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

所以,如果有更好的解决方案,将不胜感激