我有一个用户服务检索的用户对象。我想知道在我的应用程序中保持对此User对象的所有引用同步的最佳方法。 (即不同的控制器),不使用UI提供程序。
我认为只是通过使用工厂来引用,但什么也没发生。
这是我的工厂:
angular.module('app').factory('userFactory', function ($http) {
function login (username, password) {
return $http.post('/login/login', {
username: username,
password: password
}).then(function success (response) {
return response.data;
})
})
var user = {
login: login
};
return user;
这是一个控制器:
angular.module('app')
.controller('LoginCtrl', function ($scope, $location, UserFactory) {
$scope.login = function (username, password) {
UserFactory.login(username, password).then(function success (response) {
$scope.user = response.user;
});
};
我的第二个控制器:
angular.module('app')
.controller('HeadCtrl', function ($scope, $location, UserFactory) {
$scope.login = function (username, password) {
UserFactory.login(username, password).then(function success (response) {
$scope.user = response.user;
});
};
因此,如果在我的应用程序中同时使用其中的每一个,我如何确保$ scope.user在两者之间完全相同。 (那么,如果我通过一个控制器登录,登录状态会在第二个控制器中发生变化吗?
我在每个控制器中尝试了这个:
$scope.$watch('user', function (newVal, oldVal) {
console.log('Something changed');
}, true);
但它也没有用。
答案 0 :(得分:0)
将登录用户存储在UserFactory
中,以便可以在多个控制器之间共享。
angular.module('app').factory('UserFactory', function ($http) {
var user = {
currentUser: null,
login: login
};
return user;
function login (username, password) {
return $http.post('/login/login', {
username: username,
password: password
}).then(function success (response) {
user.currentUser = response.data;
return user.currentUser;
});
}
}
然后,观察工厂的属性并将其与控制器中的$scope
同步。
$scope.user = UserFactory.currentUser;
$scope.$watch(function () {
return UserFactory.currentUser;
}, function () {
$scope.user = UserFactory.currentUser;
});
$scope.login = function (username, password) {
UserFactory.login(username, password);
};