Javascript 在angularjs中共享和保存来自多个控制器的数据
我似乎不知道该怎么解决这个问题: 我有多个角度控制器,它们都需要一个用户对象,它们可以使用该对象进行操作,每次它被操作时,“新”数据也需要在其他控制器中输出。同时,我需要将这个用户对象保存在数据库中,以便以后检索(因此,当用户对象上的数据发生更改时,可以使用自动保存功能) 但是我似乎不知道我应该使用工厂还是服务来保存这个用户对象,以及如何让这个工厂/服务通过API保存用户的更改 我读了这个例子,他想完成一些相同的事情,但API部分和异步自动保存确实给我带来了麻烦 底线是,我有多个控制器,需要服务器端的用户对象。这些控制器使用相同的用户对象进行操作,在每次操作之后(可能使用一些去抖动),我想通过API将对象保存到数据库中 (首先,我想在服务/工厂中观察对象,但发现我不能:()Javascript 在angularjs中共享和保存来自多个控制器的数据,javascript,angularjs,Javascript,Angularjs,我似乎不知道该怎么解决这个问题: 我有多个角度控制器,它们都需要一个用户对象,它们可以使用该对象进行操作,每次它被操作时,“新”数据也需要在其他控制器中输出。同时,我需要将这个用户对象保存在数据库中,以便以后检索(因此,当用户对象上的数据发生更改时,可以使用自动保存功能) 但是我似乎不知道我应该使用工厂还是服务来保存这个用户对象,以及如何让这个工厂/服务通过API保存用户的更改 我读了这个例子,他想完成一些相同的事情,但API部分和异步自动保存确实给我带来了麻烦 底线是,我有多个控制器,需要服务
你们能给我指出正确的方向吗?当在控制器之间共享数据时,服务是一种方式。你们似乎已经对此有了很好的想法
为了在每次操作后保存用户,我不明白问题是什么。创建一个modify user方法,然后可以进行对象比较。如果存在差异,请将PUT请求发送到api。创建服务还是工厂实际上是一个设计问题 您可能希望查看库,例如,或,它可以帮助您创建将模型与API端点关联以获取和保存的服务 异步自动保存可以在服务中或控制器上解决 披露:我是ThickM的作者
用户
对象(通过服务或工厂)$watch
从服务内部插入内容,您可以插入$rootScope
服务演示服务可能如下所示:
.factory('User', function ($q, $rootScope, $timeout) {
var apiEndpoint = '/api/user';
var guest = {
username: 'Guest',
email : null,
loggedIn: false
};
var user = {};
user.login = function (credentials) {
user.logout();
// In real app: Make a login request
var request = $q.defer();
$timeout(function () {
user.username = 'ExpertSystem';
user.email = 'expert@system';
user.loggedIn = true;
request.resolve(user);
}, 1000);
return request.promise;
};
user.logout = function () {
// In real app: Make a logout request
angular.extend(user, guest);
};
user.update = function () {
// In real app: Make a request to update user info
alert('Updating the backend...');
};
var updateTimeout;
user.updateWithDebounce = function () {
$timeout.cancel(updateTimeout);
updateTimeout = $timeout(function () {
user.update();
}, 1000);
};
$rootScope.$watchCollection(function () {
return user;
}, function (newValue, oldValue) {
var shouldUpdate = newValue && newValue.loggedIn &&
oldValue && oldValue.loggedIn;
// Immediate backend update
//if (shouldUpdate) user.update();
// Debounced backend update (1 sec debounce)
if (shouldUpdate) user.updateWithDebounce();
});
user.login();
return user;
});
另请参见此我建议您始终使用服务/工厂在控制器(以及指令)之间共享数据,并在两侧注入数据 之后,只需使用承诺解析函数来更新服务值
app.factory('SharedService', function() {
return {
sharedObject: {
value: '',
value2: ''
}
};
});
app.controller('FirstCtrl', function($scope, SharedService) {
$scope.model = SharedService.sharedObject;
});
app.directive('myDirective',['SharedService', function(SharedService){
return{
restrict: 'E',
link: function(scope){
scope.model = SharedService.sharedObject;
},
template: '<div><input type="text" ng-model="model.value"/></div>'
}
}]);
app.factory('SharedService',function(){
返回{
共享对象:{
值:“”,
值2:“”
}
};
});
app.controller('FirstCtrl',函数($scope,SharedService){
$scope.model=SharedService.sharedObject;
});
应用程序指令('myDirective',['SharedService',函数(SharedService){
返回{
限制:'E',
链接:功能(范围){
scope.model=SharedService.sharedObject;
},
模板:“”
}
}]);
下面是一个plunkr,展示了如何实现:
但是我应该在哪里创建这种比较呢?在我的小幻想中,我是否希望在控制器中执行类似的操作:$scope.user.name.lastName=“Hansen”;(甚至是绑定到输入字段的ng模型)然后在服务中“捕获”更改,并通过工厂保存数据。但是服务如何看到有更改呢?我想要一个控制器$watch,但在服务中我不能。如果将服务注入到控制器中,您可以轻松访问它。ServiceName.user.name.lastName='abc'或者更好的一个用户对象ServiceName.user.editName({lastName:'abc'})。该对象可能包含一个比较函数,编辑函数可以在应用更改后调用该函数。虽然我遇到了一个问题,即工厂数据是异步获取的,而且控制器似乎无法从我工厂的$http.get.Great示例中获取获取数据。尝试将其混合后,我重新开始,并你的代码和我的混合在一起。它工作得很好。我只是要习惯控制器中我的用户对象的想法,它有属性和方法。非常感谢!