2013-09-25 2 views
1

Завод отправляет данные на сервер и обрабатывается правильно, но после этого «.then» в контроллере не вызывается ниже.Угловое обещание с jquery ajax

Пожалуйста, дайте мне знать, почему «то» часть не выполняется в контроллере здесь после успешного вызова ajax.

завод

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; 
       } 
     }  
    }); 

conrtoller

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

Пожалуйста, не Не делай этого !!! Если вы используете $ .ajax JQuery и манипуляцию с домом через JQuery на заводе, ну, Angular ничего, и вам это не нужно! Поместите свою DOM-манипуляцию в директивы и сделайте запрос ajax с помощью API AngularJS: $ http, $ resource –

+1

вы побеждаете цель такого углового –

+0

На самом деле это не работало, поэтому он попытался это сделать $ http ({method: 'POST »URL: '/ startcampaign', данные: form_data, заголовки: { 'Content-Type': 'применение/х-WWW-форм-urlencoded'}}) успех (функция (данные, статус, заголовки, конфигурация) {. \t \t \t \t \t \t \t \t deferred.resolve(); \t \t \t \t \t \t \t}) \t \t \t .error (function() {deferred.reject();}); \t \t \t return offfer.promise; – rohit

ответ

3

Вы используете $.ajax() для запуска вызова. Правильный способ сделать это - использовать службу $ http. Когда вызов совершается через эту услугу, $ apply автоматически триггера, и все ваши обещания будут выполнены в этом цикле $ apply.

Если вы хотите, чтобы вызвать обещание от вашей функции успеха внутри $.ajax() вызова, я полагаю, вы можете сделать это внутри $ применять цикл:

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

Здесь рабочий fiddle with correct way to invoke promise

+0

Спасибо. Он работает сейчас. Я хочу преобразовать из jquery в $ http углового, но этот ниже код не отправляет какие-либо данные на сервер $ http ({method: 'POST', url: '/ startcampaign', data: form_data, headers: {'Content -Type': 'application/x-www-form-urlencoded'}}) .success (функция, данные, статус, заголовки, config) { $ rootScope. $ Apply (function() { deferred.resolve();}); }) .error (function() { $ rootScope. $ apply (function() { deferred.reject();}); }); return offfer.promise; – rohit

+0

меня тоже я привязан к использованию $ .ajax, это из-за CORS на сервере для POST. может быть в prod $ http лихорадочно ... – netalex

Смежные вопросы