Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 为什么控制器中的数据不能与Angular和Mongoose同步?_Angularjs_Mongodb_Mean Stack - Fatal编程技术网

Angularjs 为什么控制器中的数据不能与Angular和Mongoose同步?

Angularjs 为什么控制器中的数据不能与Angular和Mongoose同步?,angularjs,mongodb,mean-stack,Angularjs,Mongodb,Mean Stack,我在一个电子商务网站上工作,使用的是具有用户帐户的平均堆栈。我正在尝试这样做,如果有人在没有登录的情况下将产品添加到他们的购物车中,这些项目将添加到cookie购物车中。然后,如果用户登录,购物车将添加到他们在数据库中的帐户并同步 然而,我有一个问题。如果有人在登录之前将项目添加到购物车中,那么在登录后,这些项目确实会被传输到购物车中,并被添加到数据库中。但是,只有在他们登录时进行了一些更改后,才会反映此更改 因此,例如,如果有人在登录之前向购物车添加5个项目,然后登录,则购物车中不会显示任何项

我在一个电子商务网站上工作,使用的是具有用户帐户的平均堆栈。我正在尝试这样做,如果有人在没有登录的情况下将产品添加到他们的购物车中,这些项目将添加到cookie购物车中。然后,如果用户登录,购物车将添加到他们在数据库中的帐户并同步

然而,我有一个问题。如果有人在登录之前将项目添加到购物车中,那么在登录后,这些项目确实会被传输到购物车中,并被添加到数据库中。但是,只有在他们登录时进行了一些更改后,才会反映此更改

因此,例如,如果有人在登录之前向购物车添加5个项目,然后登录,则购物车中不会显示任何项目。然后在他们的购物车中添加一个项目后,它将显示6个项目。有没有办法避免这种情况

这是我的密码:

角用户工厂

角积控制器

猫鼬与快速代码


我想说问题出在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);
        } 
      });
    });
  }));