$watch
only evaluate string or function parameter in its first argument. Change your $watch
like this :
$scope.$watch('cart.name + cart.id + cart.amount', $scope.updateCart());
OR
$scope.$watch('cart', $scope.updateCart, true);
See reference API