我在使用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();
}
);
})
}
答案 0 :(得分:1)
为什么你不在当地存放篮子?然后你可以只更新你的篮子对象,让$ scope完成其余的工作吗?
你做了吗?那样的?:
设置一个布尔变量getCanvas()
,并在成功更改您的购物篮时更改它。
$观察变量
$scope.basketHasChanged
我认为这应该是最简单的方法。