我尝试在Angular JS中编写工厂方法:
.factory('FriendsFactory', function(){
var friend = {};
friend.delete = function(id) {
notificationsModal.show('danger', messages_info[86]);
notificationsModal.confirm(function() {
this.deleteAjax(event, id, type);
})
}
friend.deleteAjax = function (event, id, type){
var target = angular.element(event.target);
var request = $http({
method: "POST",
url: "/subscribe/deletesubscriber",
data: $.param({ id : id, type : type }),
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
});
request.success(function () {
target.closest('.notif-item').remove();
$scope.counter--;
});
request.error(function () {
// TODO
});
}
return friend;
})
此代码有两种方法:friend.delete()
也friend.deleteAjax()
从工厂调用函数:
.controller('FriendsController', ['$scope','$http', 'friendsFactory', function($scope, $http) {
$scope.deleteUser = function (idUser) {
friendsFactory.delete(idUser);
}
}])
我需要在$scope.counter
ajax响应中递减变量friend.deleteAjax()
,无论控制器来自工厂。
我可以在每个控制器中复制:
$scope.counter = 10;
并且在致电工厂之后,但它并不好
答案 0 :(得分:2)
你做了很多很多错事:
使用friendsFactory
代替FriendsFactory
:
.controller('FriendsController', ['$scope','$http', 'friendsFactory'
here --------^
忘记将friendsFactory
声明为控制器函数的参数:
.controller('FriendsController', ['$scope','$http', 'friendsFactory', function($scope, $http) {
here ----^
在服务中访问未定义的$scope
变量:
$scope.counter--;
^--- here
在服务中进行DOM操作......
服务职责不是操纵DOM和控制器范围。
应使用html模板中的指令修改DOM。
控制器范围应由控制器管理,而不是由服务管理。从request
函数返回promise deleteAjax()
,让控制器注册成功回调,而不是在服务中执行。然后,此回调将能够访问控制器范围。
请注意,大多数错误都是基本的JavaScript错误,应该由优秀的JavaScript编辑器发出信号,或至少通过查看浏览器控制台中的错误来发出错误。
答案 1 :(得分:2)
尽管@JBNizet提出的答案是绝对正确的,但如果您必须按原样使用代码,那么您可以做两件事。首先是简单地将$ scope从控制器传递给服务调用(不建议使用更简洁的方法):
$scope.deleteUser = function (idUser) {
friendsFactory.delete(idUser, $scope);
}
您可以在工厂内使用示波器 第二个选项是将当前控制器的作用域用于根作用域,然后在工厂中使用它。
在您的控制器中
$scope.deleteUser = function (idUser) {
$rootScope.callingControllerScope = $scope;
friendsFactory.delete(idUser);
}
在您的工厂
friend.deleteAjax = function (event, id, type){
console.log($rootScope.callingControllerScope.counter);
// your code
}
您还需要修复依赖注入:
.controller('FriendsController', ['$scope','$http', 'FriendsFactory', function($scope, $http, friendsFactory) {
$scope.deleteUser = function (idUser) {
friendsFactory.delete(idUser, $scope);
}
}]);