如何将$ scope传递给工厂

时间:2016-09-29 06:38:29

标签: javascript angularjs

我正在尝试将范围传递给工厂并在应该调用该函数的控制器中使用它,但它只是不起作用。

var myApp = angular.module('mainApp', []);

myApp.factory("UserService", function ($http) {
var users = ["xxxxx", "yyyyy", "zzzzz"];

return {
    all: function () {
        return users;
        console.log( users );
    },
    first: function () {
        return users[1];
    },
    checkUser: function(elUrl, classHide, classShow){
        $http.post(elUrl)
        .success(function (data, status, headers, config) {
            if (!data.isMember) {
                el = classHide //should be when invoking: $scope.mailexist = classHide;
                $('form').submit();
            } else {
                el = classShow //should be when invoking: $scope.mailexist = classShow;
                return false;
            }
        }).error(function (data, status, header, config) {
            //$scope.ResponseDetails = "Data: " + data +
            "<hr />status: " + status +
            "<hr />headers: " + header +
            "<hr />config: " + config;
        });
    }
};
});
 myApp.controller('mainCtrl', ['$scope', '$http', 'UserService', function ($scope, $http, UserService) {

UserService.checkUser( 'inc/memberSearch.jsp?user.Email=' + $scope.umail + '&group.PK=' + angular.element('.grp').val(),
            $scope.mailexist,
            'mail-exist-hide',
            'mail-exist-show');

}]);

mailexists是HTML中文本元素的ng-class,应根据服务器响应显示或隐藏:

<p ng-class="mailexist">Text Text text Text</p>

正在调用控制器中的函数,但不显示文本。如果我在工厂中添加$ scope,那么我得到的$ scope未定义,这是真的。 但$ scope不能注入工厂/服务。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您应该在控制器中处理成功或错误,只需返回响应

checkUser: function(elUrl, classHide, classShow){
  return  $http.post(elUrl)
}

控制器中的句柄

UserService.checkUser( 'inc/memberSearch.jsp?user.Email=' + $scope.umail + '&group.PK=' + angular.element('.grp').val(),
        $scope.mailexist,
        'mail-exist-hide',
        'mail-exist-show').then(function(){
            if (!response.data.isMember) {
        $scope.mailexits = 'mail-exist-hide'; 
        $('form').submit();
    } else {
        $scope.mailexits = 'mail-exist-show'; 
        return false;
    }
        }, function(response){
        $scope.ResponseDetails = "Data: " + response.data;
        });}]);

答案 1 :(得分:1)

factory中的{p> MVC代表model,不应与view结合 - 您尝试实现的内容应由controller处理

这样的事情应该没问题:

var myApp = angular.module('mainApp', []);

myApp.factory("UserService", function ($http) {
    var users = ["xxxxx", "yyyyy", "zzzzz"];

    return {
        all: function () {
            return users;
            console.log( users );
        },
        first: function () {
            return users[1];
        },
        checkUser: function(elUrl, classHide, classShow){
            return $http.post(elUrl);
        }
    };
});

myApp.controller('mainCtrl', ['$scope', '$http', 'UserService', function ($scope, $http, UserService) {

UserService.checkUser( 'inc/memberSearch.jsp?user.Email=' + $scope.umail + '&group.PK=' + angular.element('.grp').val(),
            $scope.mailexist,
            'mail-exist-hide',
            'mail-exist-show').then(function(){
                // on success
            }, function(){
                // on error
            });
}]);

答案 2 :(得分:0)

将$ scope作为参数发送到工厂,如

UserService.checkUser($scope,param1,..);

比在工厂使用它

checkUser: function(scope,p1,...){

现在在工厂使用这个范围:)希望这会有所帮助