指向同一服务的多个控制器,在任何地方更新数据

时间:2015-05-04 09:16:58

标签: angularjs model-view-controller promise

我在使用AngularJS框架时遇到了一些麻烦。我有多个视图(ui-router),控制器绑定到它们(ofc)。其中一些是指相同的服务,有些则不是。这是例如我的userFactory:

function UserFactory () {
var factory = {};

factory.signIn = function (header) {
    return new Promise (function (resolve, reject) {
        $.when(
            $.ajax({
                type: 'POST',
                url: me.baseUrl + 'api/users/login',
                headers: {
                    'Authorization': header
                }
            })
        ).then(
            function() {
                resolve();
            }, 
            function () {
                reject();
            }
        );
    });
}

factory.getUserInformation = function (header) {
    return new Promise(function (resolve, reject) {
        $.when(
            $.ajax({
                type: 'GET',
                url: me.baseUrl + 'api/users/get',
                headers: {
                    'Authorization': header
                }
            })
        ).then(
            function (user) {
                resolve(user);
            },
            function () {
                reject();
            }
        );
    })
}

return factory;
};

加载SPA时,有2个视图使用此服务。它们都检索用户信息(factory.getUserInformation())。这导致2个HTTP请求正在检索完全相同的信息。

在同一项服务中,我有一种方法可以从篮子中移除产品。现在问题是:我有另一个显示用户他/她的篮子的视图。所以我创建了一个EventEmitter对象,告诉Basket-view更新自己。这会再次启动HTTP请求。有没有办法让Basket-view注意到数据已经改变了?

factory.removeProductFromBasket = function (productId, header) {
    return new Promise(function (resolve, reject) {
        $.when(
            $.ajax({
                type: 'POST',
                url: me.baseUrl + 'api/baskets/products/remove',
                headers: { 
                    'Content-type': 'application/json',
                    'Authorization': header 
                },
                data: JSON.stringify(productId)
            })
        ).then(
            function () {
                resolve();
            },
            function () {
                reject();
            }
        );
    })
}

1 个答案:

答案 0 :(得分:1)

为什么你不在当地存放篮子?然后你可以只更新你的篮子对象,让$ scope完成其余的工作吗?

你做了吗?那样的?:

设置一个布尔变量getCanvas(),并在成功更改您的购物篮时更改它。

$观察变量

$scope.basketHasChanged

我认为这应该是最简单的方法。