1

工厂将数据发送到服务器并对其进行正确处理,但之后控制器中的“.then”不会在下面被调用。

请让我知道为什么在成功调用 ajax 后这里的控制器中没有执行“then”部分。

工厂

myapp.factory('startCampFactory',function($http,$q,$rootScope){

        return {

            startNewCampaign : function(){

            var e = $("input#email");
            var email = e.val();
            var campname = $("input#campaignname").val();
            var about = $("textarea#about").val();
            var tamt = $("input#targetamount").val();
            var edate = $("input#enddate").val();
            var invitees = $("input#invitees").val();
            var file_data = $("#file").prop("files")[0];
            var form_data = new FormData();     
            form_data.append("file",file_data);
            form_data.append("email",email);
            form_data.append("campaignname",campname);
            form_data.append("about",about);
            form_data.append("targetamount",tamt);
            form_data.append("enddate",edate);
            form_data.append("invitees",invitees);
            console.log(email+about+campname);
            var deferred = $q.defer();
            $.ajax({
                type:'POST',
                url: "http://localhost:8080/startcampaign",
                data:form_data,
                contentType:false,
                processData:false,
                cache:false,
                dataType:"json",
                success:function(msg,status)
                {
                    //if(status=="success")

                        deferred.resolve("success");
                        $rootScope.$apply();
                },
                        error:function()
                        {

                            deferred.reject();
                            $rootScope.$apply();
                        }
                });
                return deferred.promise;
                }
        }       
    });

控制器

function startCampCtrl($scope,startCampFactory)
{
    $scope.startcamp = function(){
        $("#submit").prop('disabled',true);

        startCampFactory.startNewCampaign().then(function(d){
            alert("here");
            var temp = "<div class=\"alert alert-dismissable alert-success\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button> <strong>Campaign Saved successfully</strong></div>";
                $(temp).prependTo("#startcamp");
                $("#submit").prop('disabled',false);
                $("input#campaignname").val('');
                $("textarea#about").val('');
                $("input#targetamount").val('');
                $("input#enddate").val('');
                $("input#invitees").val('');
                $("input#file").val('');
        },
        function(){//On error
            var temp = "<div class=\"alert alert-dismissable alert-warning\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button> <strong>Campaign could not be saved, please try again</strong></div>";
                $(temp).prependTo("#startcamp");
                    $("#submit").prop('disabled',false);
        });

    }

}
4

1 回答 1

3

您正在使用$.ajax()触发呼叫。正确的做法是使用 $http 服务。当通过该服务进行调用时,会自动触发 $apply ,并且您的所有承诺都将在该 $apply 周期中执行。

如果您想在$.ajax()调用中触发成功函数的承诺,我想您可以在 $apply 循环中执行此操作:

.....
success:function(msg,status){
                   $rootScope.$apply( function() { 
                        deferred.resolve("success"); 
                     });
}
....

这是调用承诺的正确方法的工作小提琴

于 2013-09-25T15:22:41.227 回答