Angularjs 为什么控制器中的数据不能与Angular和Mongoose同步?
我在一个电子商务网站上工作,使用的是具有用户帐户的平均堆栈。我正在尝试这样做,如果有人在没有登录的情况下将产品添加到他们的购物车中,这些项目将添加到cookie购物车中。然后,如果用户登录,购物车将添加到他们在数据库中的帐户并同步 然而,我有一个问题。如果有人在登录之前将项目添加到购物车中,那么在登录后,这些项目确实会被传输到购物车中,并被添加到数据库中。但是,只有在他们登录时进行了一些更改后,才会反映此更改 因此,例如,如果有人在登录之前向购物车添加5个项目,然后登录,则购物车中不会显示任何项目。然后在他们的购物车中添加一个项目后,它将显示6个项目。有没有办法避免这种情况 这是我的密码: 角用户工厂 角积控制器 猫鼬与快速代码Angularjs 为什么控制器中的数据不能与Angular和Mongoose同步?,angularjs,mongodb,mean-stack,Angularjs,Mongodb,Mean Stack,我在一个电子商务网站上工作,使用的是具有用户帐户的平均堆栈。我正在尝试这样做,如果有人在没有登录的情况下将产品添加到他们的购物车中,这些项目将添加到cookie购物车中。然后,如果用户登录,购物车将添加到他们在数据库中的帐户并同步 然而,我有一个问题。如果有人在登录之前将项目添加到购物车中,那么在登录后,这些项目确实会被传输到购物车中,并被添加到数据库中。但是,只有在他们登录时进行了一些更改后,才会反映此更改 因此,例如,如果有人在登录之前向购物车添加5个项目,然后登录,则购物车中不会显示任何项
我想说问题出在UserFactory.currentUser的实现中。似乎它在错误的时间在客户端更新。客户端用户是否与服务器端mongo返回的相同?关于$.watchfunction。。。更改返回对象的内部属性时,不会触发$watch。只有在引用时才会触发changes@KirillSlatin,问题是我使用了不返回对象的更新。你能解释更多关于美元手表的事吗?您的意思是不会显示从工厂返回的项目属性的更改-只显示引用更改?当一个项目从其他控制器更新时,我如何保持它的同步?控制器可以工作,因为实际上总是替换对象本身。看看这个。这有点可怕,因为一旦你进入它,就发出警报。代码非常简单,并显示$watchfunction仅在按下更改按钮时触发,该按钮将替换对象。但通过输入数据绑定修改字段只会影响对象的属性。例如,如果您有currentUser.cart=receivedUser.cart,您的$watch将不会触发
angular.module('app')
.factory('UserFactory', function ($http, $cookieStore, $location, AuthTokenFactory) {
var user = {};
function login (email, password) {
return $http.post('/api/login/login', {
email: email,
password: password
}).then(function success (response) {
AuthTokenFactory.setToken(response.data.token);
user.currentUser = response.data.user;
user.currentUser.show = true;
if ($cookieStore.get('cart')) {
$cookieStore.remove('cart');
}
}, function (httpError) {
throw httpError.status + " : " + httpError.data;
});
}
...
var user = {
addToCart : addToCart,
login: login,
checkToken: checkToken,
getUser: getUser,
currentUser: null
};
}
angular.module('nightwalkerApp')
.controller('AccountCtrl', function ($scope, $location, UserFactory) {
if (!UserFactory.checkToken()) {
$location.path('/login');
}
$scope.user = UserFactory.currentUser;
$scope.logout = UserFactory.logout;
$scope.$watch(function () {
return UserFactory.currentUser;
}, function () {
$scope.user = UserFactory.currentUser;
}, true);
});
passport.use('local-login', new LocalStrategy ({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
},
function (req, email, password, done) {
Users.findOne({email: email}, function(err, user) {
// If there are any errors, return the error before anything else
if (err) {
return done(err);
}
// Check if password is valid
user.checkPassword(password, function(err, auth) {
if (err) {
return done(err);
}
if (!auth) {
// An incorrect password was issued
return done(null, false, 'Sorry, incorrect email or password');
}
// All is well
var cart = req.cookies.cart;
// If the user has a temporary cart, add items to real cart
if (cart) {
var items = JSON.parse(cart);
user.update({$pushAll: {cart: items}}, {}, function (err, numAffected, obj) {
return done(null, user);
});
} else {
return done(null, user);
}
});
});
}));