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 が自動的にトリガーされ、すべての promise がその $apply サイクルで実行されます。

呼び出し内で成功関数からプロミスをトリガーしたい場合は$.ajax()、 $apply サイクル内で実行できると思います。

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

これは、約束を呼び出す正しい方法を備えた実用的なフィドルです

于 2013-09-25T15:22:41.227 に答える